美文网首页mongodb
MongoDB-基础使用(一)

MongoDB-基础使用(一)

作者: 石头耳东 | 来源:发表于2022-06-01 17:21 被阅读0次

    零、本文纲要

    一、MongoDB相关概念

    1. 应用场景
    2. 体系结构
    3. 数据模型

    二、使用MongoDB

    1. 安装MongoDB
    2. 常用命令
      ① 数据库操作
      ② 集合操作(对应数据库表操作)
      ③ 文档操作(相当于数据库CRUD)
      Ⅰ 插入数据
      Ⅱ 查询操作
      Ⅲ 更新操作
      Ⅳ 删除操作
      ④ 文档操作(其他常用查询)
      Ⅰ 统计操作
      Ⅱ 分页操作
      Ⅲ 排序操作
      Ⅳ 模糊查询(正则查询)
      Ⅴ 比较查询
      Ⅵ 包含查询
      Ⅶ 条件连接查询
      ⑤ 操作小结

    一、MongoDB相关概念

    1. 应用场景

    ① 数据量大;
    ② 写入操作频繁(读写都很频繁);
    ③ 价值较低的数据,对事务性要求不高;

    2. 体系结构

    SQL术语/概念 MongoDB术语/概念 解释说明
    database database 数据库
    table collection 数据库表/集合
    row document 数据记录行/文档
    column field 数据字段/域
    index index 索引
    table joins / 表连接,MongoDB不支持
    / 嵌入文档 MongoDB通过嵌入式文档来替代多表连接
    primary key primary key 主键,MongoDB自动将_id字段设置为主键

    3. 数据模型

    MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。
    数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。

    Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object;
    mongo还使用了特殊的数据类型,包括:date,object id,binary data,regular expression 和code。

    常见数据类型

    数据类型 描述 举例
    String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 {"x" : "foobar"}
    Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 shell是不支持该类型的,
    shell中默认会转换成64位浮点数
    Boolean 布尔值。用于存储布尔值(真/假)。 {"x":true}+
    Double 双精度浮点值。用于存储浮点值。 {"x":3.14159,"y":3}
    Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
    Array 用于将数组或列表或多个值存储为一个键。 {"x" : ["a", "b", "c"]}
    Timestamp 时间戳。记录文档修改或添加的具体时间。
    Object 用于内嵌文档。
    Null 用于创建空值。 {"x":null}
    Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
    Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
    Object ID 对象 ID。用于创建文档的 ID。 {"X" :ObjectId() }
    Binary Data 二进制数据。用于存储二进制数据。
    Code 代码类型。用于在文档中存储 JavaScript 代码。 {"x" : function() { /* …… */ }}
    Regular expression 正则表达式类型。用于存储正则表达式。 {"x" : /foobar/i}

    二、使用MongoDB

    1. 安装MongoDB

    下载MongoDB

    下载MongoDB.png

    ① 解压至指定目录

    tar -zxvf mongodb-linux-x86_64-4.0.10.tgz -C /usr/local
    

    ② 准备数据目录

    cd mongodb-linux-x86_64-4.0.10/
    
    mkdir -p single/data/db
    mkdir -p single/log
    

    ③ 编写配置文件

    touch single/mongodb.conf
    
    systemLog:
        #MongoDB发送所有日志输出的目标指定为文件
        # #The path of the log file to which mongod or mongos should send all diagnostic logging information
        destination: file
        #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
        path: "/usr/local/mongodb-linux-x86_64-4.0.10/single/log/mongod.log"
        #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
        logAppend: true
    storage:
        #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
        ##The directory where the mongod instance stores its data.Default Value is "/data/db".
        dbPath: "/usr/local/mongodb-linux-x86_64-4.0.10/single/data/db"
        journal:
            #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
            enabled: true
    processManagement:
        #启用在后台运行mongos或mongod进程的守护进程模式。
        fork: true
    net:
        #服务实例绑定的IP,默认是localhost
        bindIp: localhost,192.168.253.128
        #bindIp
        #绑定的端口,默认是27017
        port: 27017
    

    ④ 启动MongoDB服务

    bin/mongod -f single/mongodb.conf
    

    查看进程启动情况:ps -ef | grep mongod

    ⑤ 关闭MongoDB服务

    标准的关闭方法需要连接至其客户端进行关闭,如下:

    bin/mongo --port 27017
    use admin
    db.shutdownServer()
    

    如果遇到数据损坏:

    rm -f single/data/db/*.lock
    bin/mongod --repair --dbpath=single/data/db
    

    2. 常用命令

    MongoDB官方文档,这个网址不稳定,需要飞机。

    首先登录其client端bin/mongo --port 27017,此处也可以使用其他数据库客户端直接连接,如:DataGrip。

    ① 数据库操作

    # 创建数据库
    use [database_name]
    #如:
    use db_test
    
    # 查看当前权限的所有数据库
    show databases
    show dbs
    
    # 查看当前正在使用的数据库
    db
    
    # 删除数据库,删除当前数据库
    db.dropDatabase()
    

    ② 集合操作(对应数据库表操作)

    # 显示创建(了解)
    db.createCollection(["collection_name"])
    #如:
    db.createCollection("collection_test")
    
    #查看当前库中的集合(对应数据库的表)
    show collections
    show tables
    
    # 删除集合
    db.collection.drop()
    db.[collection_name].drop()
    #如:
    db.collection_test.drop()
    

    ③ 文档操作(相当于数据库CRUD)

    Ⅰ 插入数据

    注意:此处插入的数据后续会持续用到,如果后续数据不足可以重新插入几个。

    # 单个文档插入
    db.collection.insertOne(
       <document>,
       {
          writeConcern: <document>
       }
    )
    #如:
    db.collection_test.insertOne(
        {
            "articleid":"100000",
            "content":"今天天气真好,阳光明媚",
            "userid":"1001",
            "nickname":"Rose",
            "createdatetime":new Date(),
            "likenum":NumberInt(10),
            "state":null
        }
    )
    
    # 批量插入
    db.collection.insertMany(
       [ <document 1> , <document 2>, ... ],
       {
          writeConcern: <document>,
          ordered: <boolean>
       }
    )
    #如:
    db.collection_test.insertMany([
        {
            "_id":"1",
            "articleid":"100001",
            "content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我他。",
            "userid":"1002",
            "nickname":"相忘于江湖",
            "createdatetime":new Date("2019-08-05T22:08:15.522Z"),
            "likenum":NumberInt(1000),
            "state":"1"
        },
        {
            "_id":"2",
            "articleid":"100001",
            "content":"我夏天空腹喝凉开水,冬天喝温开水",
            "userid":"1005",
            "nickname":"伊人憔悴",
            "createdatetime":new Date("2019-08-05T23:58:51.485Z"),
            "likenum":NumberInt(888),
            "state":"1"
        }
    ]);
    

    参数说明:
    document:要写入的文档;
    writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求;
    ordered:指定是否按顺序写入,默认 true,按顺序写入。
    一般我们都只写<document>,writeConcern 与 ordered 使用默认值即可。

    Ⅱ 查询操作

    # 查询所有
    db.[collection_name].find()
    db.[collection_name].find({})
    #如:
    db.collection_test.find();
    
    # 条件查询
    db.[collection_name].find(
        {
            [field_name]: [field_value]
        }
    )
    #如:
    db.collection_test.find({articleid: "100000"})
    db.collection_test.find({articleid: "100001", likenum: 888})
    
    # 投影查询:指定显示与不显示的字段
    db.[collection_name].find(
        {
            [field_name]: [field_value]
        },
        {
            [field_name]: 1, #显示
            [field_name]: 0  #不显示
        }
    )
    #如:
    db.collection_test.find(
        {articleid: "100001", likenum: 888},
        {_id: 0, articleid: 1, likenum: 1}
    )
    
    查询全部.png

    Ⅲ 更新操作

    # 单个更新操作
    db.collection.updateOne(
       <filter>,
       <update>,
       {
         upsert: <boolean>,
         writeConcern: <document>,
         collation: <document>,
         arrayFilters: [ <filterdocument1>, ... ],
         hint:  <document|string>        // Available starting in MongoDB 4.2.1
       }
    )
    #如:
    db.collection_test.updateOne(
        {articleid: "100000"},
        {$set:{likenum:NumberInt(99)}}
    )
    
    # 批量更新
    db.collection.updateMany(
       <filter>,
       <update>,
       {
         upsert: <boolean>,
         writeConcern: <document>,
         collation: <document>,
         arrayFilters: [ <filterdocument1>, ... ],
         hint:  <document|string>        // Available starting in MongoDB 4.2.1
       }
    )
    #如:
    db.collection_test.updateMany(
        {articleid: "100001"},
        {$set:{likenum:NumberInt(99)}}
    )
    
    # 列值增长 $inc
    db.collection_test.updateMany(
        {_id: "2"},
        {$inc:{likenum:NumberInt(1)}}
    )
    

    参数说明:
    filter : update的查询条件,类似sql update查询内where后面的;
    update : update的对象和一些更新的操作符(如,inc...)等,也可以理解为sql update查询内set后面的;
    upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
    writeConcern:可选,抛出异常的级别;
    collation : 可选,指定 用于操作的排序规则;
    arrayFilters :可选,筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素;
    hint:可选,指定用于支持查询谓词的索引的文档或字符串,4.2.1版本开始可用。
    一般我们也不通过语句直接使用这些参数。

    Ⅳ 删除操作

    # 删除单个
    db.collection.deleteOne(
       <filter>,
       {
          writeConcern: <document>,
          collation: <document>
       }
    )
    #如:
    db.collection_test.deleteOne(
        {likenum: NumberInt(100)}
    )
    
    # 删除多个
    db.collection.deleteMany(
       <filter>,
       {
          writeConcern: <document>,
          collation: <document>
       }
    )
    #如:
    db.collection_test.deleteMany(
        {likenum: NumberInt(99)}
    )
    # 删表跑路
    db.collection_test.deleteMany({})
    

    ④ 文档操作(其他常用查询)

    Ⅰ 统计操作

    与4.0功能兼容的MongoDB驱动程序弃用各自的光标和收集count()的API,取而代之的是新的API countDocuments()和estimatedDocumentCount()。
    此处,count()的功能我们会通过新的API实现。

    # 统计操作(类似数据库聚合查询)
    db.collection.countDocuments( <query>, <options> )
    #如:
    db.collection_test.countDocuments({}) #统计文档记录数
    db.collection_test.countDocuments( #统计likenum为888的记录数
        {likenum: NumberInt(888)}
    )
    
    # 不含过滤规则的统计
    db.collection.estimatedDocumentCount( <options> )
    #如:
    db.collection_test.estimatedDocumentCount({})
    

    options参数说明
    limit 整数 可选 要计算的最大文件数。
    skip 整数 可选 计数前要跳过的文档数。
    hint 字符串或文件 可选 用于查询的索引名称或索引规范。
    maxTimeMS 整数 可选的 允许计数运行的最长时间。

    避免使用db.collection.count()没有查询谓词的方法,因为如果没有查询谓词,该方法将基于集合的元数据返回结果,这可能会导致近似计数。
    特别是:
    a、在分片群集上,结果计数将无法正确过滤出孤立的文档;
    b、不正常关机后,计数可能不正确。

    Ⅱ 分页操作

    # 分页查询
    db.collection.find().limit(NUMBER).skip(NUMBER)
    #如:
    db.collection_test.find().limit(2).skip(2)
    

    Ⅲ 排序操作

    # 排序操作
    db.collection.find().sort(
        {
            field_name: 1,  #1表示升序
            field_name: -1  #-1表示降序
        }
    )
    #如:
    db.collection_test.find().sort(
        {
            state: 1,
            likenum: -1
        }
    )
    

    Ⅳ 模糊查询(正则查询)

    # 正则查询
    db.collection.find({field_name:/正则表达式/})
    #如:
    db.collection_test.find(
        {nickname: /江湖/}
    )
    

    Ⅴ 比较查询

    # 比较查询
    db.collection.find({ field_name : { $gt: value }}) // 大于: field > value
    db.collection.find({ field_name : { $lt: value }}) // 小于: field < value
    db.collection.find({ field_name : { $gte: value }}) // 大于等于: field >= value
    db.collection.find({ field_name : { $lte: value }}) // 小于等于: field <= value
    db.collection.find({ field_name : { $ne: value }}) // 不等于: field != value
    #如:
    db.collection_test.find(
        {likenum: {$gt: NumberInt(999)}}
    )
    

    Ⅵ 包含查询

    # 包含查询
    db.collection.find({ field_name : { $in:[ value1, value2]}})
    db.collection.find({ field_name : { $nin:[ value1, value2]}})
    #如:
    db.collection_test.find(
        {likenum: {$in: [NumberInt(888), NumberInt(1000)]}}
    )
    

    Ⅶ 条件连接查询

    # and连接
    db.collection.find({ $and:[{}, {}] })
    #如:
    db.collection_test.find({
        $and: [
            {likenum: {$gte: NumberInt(900)}},
            {likenum: {$lte: NumberInt(1000)}}
        ]
    })
    
    # or连接
    db.collection.find({ $or:[{}, {}] })
    #如:
    db.collection_test.find({
        $or: [
            {likenum: {$lte: NumberInt(900)}},
            {likenum: {$gte: NumberInt(950)}}
        ]
    })
    

    ⑤ 操作小结

    1. 选择切换数据库:use collection
    
    2. 插入数据:db.collection.insert({bson数据})
    
    3. 查询所有数据:db.collection.find()
    
    4. 条件查询数据:db.collection.find({条件})
    
    5. 查询符合条件的第一条记录:db.collection.findOne({条件})
    
    6. 查询符合条件的前几条记录:db.collection.find({条件}).limit(条数)
    
    7. 查询符合条件的跳过的记录:db.collection.find({条件}).skip(条数)
    
    8. 修改数据:db.collection.updateOne({条件},{修改后的数据}) 
    或 db.collection.updateOne({条件},{$set:{要修改部分的字段:数据})
    或 db.collection.updateMany({条件},{修改后的数据}) 
    
    9. 修改数据并自增某字段值:db.collection.updateOne({条件},{$inc:{自增的字段:步进值}})
    
    10. 删除数据:db.collection.deleteOne({条件})
    或 db.collection.deleteMany({条件})
    
    11. 统计查询:db.collection.count({条件})
    或 db.collection.countDocuments({条件})
    或 db.collection.estimatedDocumentCount()
    
    12. 模糊查询:db.collection.find({字段名:/正则表达式/})
    
    13. 条件比较运算:db.collection.find({字段名:{$gt:值}})
    
    14. 包含查询:db.collection.find({字段名:{$in:[值1,值2]}})
    或 db.collection.find({字段名:{$nin:[值1,值2]}})
    
    15. 条件连接查询:db.collection.find({$and:[{条件1},{条件2}]})
    或 db.collection.find({$or:[{条件1},{条件2}]})
    

    三、结尾

    以上即为MongoDB-基础使用(一)的全部内容,感谢阅读。

    相关文章

      网友评论

        本文标题:MongoDB-基础使用(一)

        本文链接:https://www.haomeiwen.com/subject/bvixmrtx.html