zoukankan      html  css  js  c++  java
  • MongoDB学习笔记

    MongoDB、Redis 非关系型数据库,非关系型数据库, 称为NoSQL ,键值对存储的形似,适合存储海量的数据

    学习MongoDB时,和MySQL有些变化

    • 数据库
    • 集合(对应MySQL中的数据表)
    • 文档(对应MySQL中的记录)
    • 域(对应MySQL中的字段)

    1 MongoDB命令

    开启客户端 sudo mongo (前提开启服务器)

    ​ 查看数据库 show dbs 或者 show databases

    ​ 查看使用的数据库 db

    ​ 切换数据库 use 数据库名字

    ​ 创建数据库 use 数据库名字

    ​ 删除数据库 db.dropDatabase()

    注意:

    • 如果数据库不存在,则创建数据库,否则切换到指定数据库

    • 刚创建的数据库并不在数据库的列表中,如 要显示它,需要向数据库中插入一些数据,才会看到刚刚创建的数据库(即如果创建了数据库没有数据,show dbs看不到)

    • MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中

      集合相关命令:

    ​ 查看当前数据库中的所有集合(数据表)

    ​ show collections

    ​ 手动创建集合

    ​ db.createCollection(name, options)

    ​ demo :

    db.createCollection("stu")

    ​ demo2:

    db.createCollection("stu", {capped:true, size: 10})

    说明:

    • 参数capped: 默认值为false表示不设置上限,值为true表示设置上限

    • 参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节

    • 查询集合上限与否 db.集合名.isCapped()

      删除集合:

      db.集合名.drop()

    2 MongoDB 中常见数据类型

    Object ID: ⽂档ID

    String: 字符串, 最常⽤, 必须是有效的UTF-8

    Boolean: 存储⼀个布尔值, true或false

    Integer: 整数32位或64位, 这取决于服务器

    Double: 存储浮点值

    Arrays: 数组或列表, 多个值存储到⼀个键

    Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档

    Null: 存储Null值

    Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数

    Date: 存储当前⽇期或时间的UNIX时间格式

    注意点:

    ​ object ID 中是一个12个字节的十六进制数,24位的字符串,它并不是一个随机数,每一对字节都有含义。 其中 前4个字节 8个字符是一个 ‘时间戳’, 接下来3个字节 ‘机器ID’ 往后2个字节是 MongoDB 的服务进程id , 最后三个字节是一个‘ 增值量’

    3 MongoDB 增删改查

    增:

    ​ MongoDB 使用 insert() 或 save() 向集合中添加(插入)文档

    db.集合名称.insert({"键":“值”})

    db.集合名称.save({"键":"值"})

    ​ demo:

    查:

    db.集合名称.find()

    ​ 易读方式查询 db.集合名称.find().pretty()

    改(更新):

    db.集合名称.update(<query>, <update>,{multi: <boolean>})

    说明:

    • 参数query:查询条件
    • 参数update:更新操作符
    • 参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新

    demo:

    db.student.update({"name":"二哈"},{"name":"哈哈"})

    demo:指定键值更新操作

    db.stu.update({name:'hr'},{$set:{name:'hys'}})
    

    demo:更新全部

    db.stu.update({},{$set:{gender:0}},{multi:true})
    

    删:

    db.集合名称.remove(<query>, {"justOne":<boolean>})
    说明:

    • 参数query:可选,删除的⽂档的条件
    • 参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条

    demo:

    db.student.remove({"name":"xxxx"})

    进阶查询

    数据准备:

    {"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }
    {"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false }
    {"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false }
    {"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true }
    {"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true }
    {"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true }
    {"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }
    
    # 一次性插入
    db.stu.insertMany([{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true },{"name" : "⻩蓉", "hometown" : "桃花岛", "age" : 18, "gender" : false },{"name" : "华筝", "hometown" : "蒙古", "age" : 18, "gender" : false },{"name" : "⻩药师", "hometown" : "桃花岛", "age" : 40, "gender" : true },{"name" : "段誉", "hometown" : "⼤理", "age" : 16, "gender" : true },{"name" : "段王爷", "hometown" : "⼤理", "age" : 45, "gender" : true },{"name" : "洪七公", "hometown" : "华⼭", "age" : 18, "gender" : true }])
    
    

    db.student.findOne({文档条件}) 查询一条数据

    1 比较运算符
    • 等于: 默认是等于判断, 没有运算符

    • ⼩于:$lt (less than)

    • ⼩于等于:$lte (less than equal)

    • ⼤于:$gt (greater than)

    • ⼤于等于:$gte

    • 不等于:$ne

    demo:

    db.集合名.find({age:{$gte:18}}) 查询大于等于 18年龄的信息

    2 逻辑运算符
    • and 查询,在json中写多个条件

      查询年龄大于等于18 并且 gender 等于true

      db.student.find({age:{$gte:18},gender:true})

    • or 查询

    查询年龄⼤于18, 或性别为false的学⽣

    db.student.find({$or:[{age:{$gt:18}},{gender:false}]})
    

    查询年龄⼤于18或性别为男⽣, 并且姓名是郭靖

    db.student.find({$or:[{age:{$gt:18}},{gender:true}],"name":"郭靖"})

    3 范围查询

    使⽤$in$nin 判断数据是否在某个数组内(非连续性的)

    查询年龄为18、28的学生

    db.student.find({age:{$in:[18,28]}})

    4 自定义查询
    db.stu.find({
        $where:function() {
            return this.age>30;
        }
    })
    

    高级用法

    1 limit() 读取文档的数量

    获取2条学生的信息

    db.student.find().limit(2)

    2 skip() 用于跳过指定数量的文档

    跳过前两个从第三个开始

    db.student.find().skip(2)

    3 skip和limit结合使用

    先使用skip再使用limit 效率更高

    db.student.find().skip(2).limit(3)

    4 投影--- 在查询到的返回结果中,只选择必要的字段

    命令:

    db.集合名称.find({},{field:1,...})
    

    说明:

    • 参数为字段和值, 值为1表示显示, 值为0不显
    • 特别注意: 对于_id列默认是显示的, 如果不显示需要明确设置为0

    demo:

    db.student.find({},{_id:0,name:1,gender:1})

    5 排序 sort()

    db.student.find().sort({域:1.....})
    说明:

    • 参数1为升序排列(从小到大) 参数-1为降序排列(从大到小)

    6 统计个数 count()

    db.student.find().count({条件})

    7 消除重复

    db.集合名称.distince("去重字段", {条件})

    demo:

    db.student.distinct("hometown",{age:{$gt:18}})

    聚合函数

    1 group分组

    2 match数据过滤

    4 索引

    目的: 在查询数据中,如果有大量的数据时,为了能够加快速度的查询,那么我们就需要创建索引。

    建立索引的注意点:

    1. 根据需要选择是否需要建立唯一索引

    2. 数据量巨大并且数据库的读出操作非常频繁的时候才需要创建索引,如果写入操作非常频繁,创建索引会影响写入速度

    3. 索引字段是升序还是降序在单个索引的情况下不影响查询效率,但是在复合索引的条件下会有影响

      在进行查询的时候如果字段1需要升序的方式排序输出,字段2需要降序的方式排序输出,那么此时复合索引的建立需要把字段

    5 MongoDB数据库备份

    备份

    保证数据库安全,主要用于灾难处理

    备份的语法:mongodump -h dbhost -d dbname -o dbdirectory

    • -h: 服务器地址, 也可以指定端⼝号
    • -d: 需要备份的数据库名称
    • -o: 备份的数据存放位置, 此⽬录中存放着备份出来的数据

    示例:mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

    恢复

    恢复语法:mongorestore -h dbhost -d dbname --dir dbdirectory

    • -h: 服务器地址
    • -d: 需要恢复的数据库实例
    • --dir: 备份数据所在位置

    示例:mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

    6 MongoDB与Python交互

    安装

    pip install pymongo

    使用pymongo

    导入pymongo并选择要操作的集合

    数据库和集合如果没有会自动创建

    from pymongo import MongoClient
    client = MongoClient(host,port)
    collection = client[db名][集合名]
    

  • 相关阅读:
    数据库分表之Mybatis+Mysql实践
    mysql中You can't specify target table for update in FROM clause错误
    SQL中的limit用法
    在电脑端打开apk文件
    mysql进阶(五)数据表中带OR的多条件查询
    Java之——汉字转换拼音(大小写)
    数据库查询模糊匹配
    produces在@requestMapping中的使用方式和作用
    JSONP跨域请求数据报错 “Unexpected token :”的解决办法
    C# TcpClient的Connect超时处理(Timeout)
  • 原文地址:https://www.cnblogs.com/kongguanghua/p/13373817.html
Copyright © 2011-2022 走看看