• MongoDB增删改查表文档


    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库。

    在高负载的情况下,添加更多的节点,可以保证服务器性能。

    MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

    数据类型:

    • Object ID :文档的id
    • String: 字符串,最常用,必须是utf-8
    • Boolean:布尔值,true 或者false
    • Integer:整数
    • Double:浮点数
    • Arrays:数组或者列表,多个值存储到一个键
    • Object:用于嵌入文档,即一个值为一个文档
    • Null:存储null值
    • Timestamp:时间戳
    • Date:存储当前日期或时间unix时间格式

    概念上来讲:

    • MongoDB的集合类似sqlserver的表
    • MongoDB的文档类似sqlserver的表数据
    • MongoDB的插入更新删除查询文档,就类似SQL的增删改查操作
    • 每个Document(文档)都有一个特殊的键 _id ,这个键值是唯一的,相当于关系型数据库中的表的主键
    • 将数据插入到 MongoDB 的集合中,就类似于如何将数据插入到表中一样
    • 文档的数据结构和 JSON 基本一样。
    • 所有存储在集合中的数据都是 BSON 格式。
    • BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

    BSON的详细介绍

    目录: 

    1、MongoDB 插入文档(增)

    2、MongoDB 删除文档(删)

    3、MongoDB 更新文档(改)

    4、MongoDB 查询文档(查)

    1、MongoDB 插入文档(增)

    MongoDB中插入文档使用 insert() 或 save() 方法向集合中插入文档,语法:

    db.集合名.insert(文档内容)

    插入文档实例1:

    下面是将文档插入到tsemongo库中的tsecollection集合中:

    _mongodb_116:3717(mongod-3.6.8-2.0) tsemongo> db.tsecollection.insert({
    ...     user_id: '10001',
    ...     account: 'MGIFK1SX2',
    ...     password: '75cebbb141e14a2f0953bb94152744d5',
    ...     nickname: 'Tse先生',
    ...     phone: '13801380000',
    ...     sex: ''
    ... })
    Inserted 1 record(s) in 1ms
    WriteResult({
      "nInserted": 1
    })

    tsecollection是集合名,如果该集合不在tsemongo数据库中,MongoDB 会自动创建tsecollection集合并插入文档。

    查询刚刚插入的文档:

    _mongodb_116:3717(mongod-3.6.8-2.0) tsemongo> db.tsecollection.find()
    {
      "_id": ObjectId("5cda73a19b21847bd9f9db2d"),
      "user_id": "10001",
      "account": "MGIFK1SX2",
      "password": "75cebbb141e14a2f0953bb94152744d5",
      "nickname": "Tse先生",
      "phone": "13801380000",
      "sex": "男"
    }
    Fetched 1 record(s) in 2ms

    也可以定义一个变量的形式插入文档:

    tsevar变量,执行了以后显示如下

    _mongodb_116:3717(mongod-3.6.8-2.0) tsemongo> tsevar = ({
    ...     user_id: '10001',
    ...     account: 'MGIFK1SX2',
    ...     password: '75cebbb141e14a2f0953bb94152744d5',
    ...     nickname: 'Tse先生2',
    ...     phone: '13881388888',
    ...     sex: ''
    ... })
    {
      "user_id": "10001",
      "account": "MGIFK1SX2",
      "password": "75cebbb141e14a2f0953bb94152744d5",
      "nickname": "Tse先生2",
      "phone": "13881388888",
      "sex": "女"
    }

    然后再执行插入操作:

    _mongodb_116:3717(mongod-3.6.8-2.0) tsemongo> db.tsecollection.insert(tsevar)
    Inserted 1 record(s) in 2ms
    WriteResult({
      "nInserted": 1
    })

    插入文档实例2:

    插入文档也可以使用 db.tsecollection.save(document) 命令

    _mongodb_116:3717(mongod-3.6.8-2.0) tsemongo> tsevar = ({
    ...     user_id: '10003',
    ...     account: 'MGIFK1SX3',
    ...     password: '75cebbb141e14a2f0953bb94152744d3',
    ...     nickname: 'Tse女士',
    ...     phone: '136613666666',
    ...     sex: ''
    ... })
    {
      "user_id": "10003",
      "account": "MGIFK1SX3",
      "password": "75cebbb141e14a2f0953bb94152744d3",
      "nickname": "Tse女士",
      "phone": "136613666666",
      "sex": "女"
    }

    再执行插入操作:

    _mongodb_116:3717(mongod-3.6.8-2.0) tsemongo> db.tsecollection.save(tsevar)
    Inserted 1 record(s) in 2ms
    WriteResult({
      "nInserted": 1
    })

     3.2 版本后还有下面两种语法可用于插入文档:

    •  db.collection.insertOne():向指定集合中插入一条文档数据
    •  db.collection.insertMany():向指定集合中插入多条文档数据
    db.tsecollection.insertOne({"Tse": 3})
    db.tsecollection.insertMany
    ([
        {
            "comment": "1.删除数据库-先use库名再执行drop",
            "command": "db.dropDatabase()"
        },
        {
            "comment": "2.删除集合(1、先use库名),到所在的库),2、show collections查看库中所有集合)",
            "command": "db.集合名.drop()"
        }
    ])

    2、MongoDB 删除文档(删)

    MongoDB remove()函数是用来移除集合中的数据。

    MongoDB数据更新可以使用update()函数。

    在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。

    语法:

    db.collection.remove(
       <query>,
       {
         justOne: <boolean>,
         writeConcern: <document>
       }
    )

    参数说明:

    • query :(可选)删除的文档的条件。
    • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
    • writeConcern :(可选)抛出异常的级别。

    实例1:

    先插入一条数据

    db.collection.insert({a:'3',b:'Tse先生',c:'20岁'})

    再查下一下这条数据是否顺利插入

    db.collection.find()

     然后再删除这条数据,再去查询,就已经删掉这条数据了

    db.collection.remove({b:'Tse先生'})

    如果你只想删除第一条找到的记录,使用deleteOne,如下所示:

    这边先插入3条数据:

    db.collection.insert({a:'3',b:'Tse先生',c:'20岁'})
    db.collection.insert({a:'4',b:'Tse先生',c:'22岁'})
    db.collection.insert({a:'5',b:'Tse先生',c:'23岁'})

    然后再删除第一条找到的记录:

    db.collection.deleteOne({b:'Tse先生'})

    这边remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。

    如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

    db.collection.remove({})
    db.collection.deleteMany({})

    删除b等于Tse先生的全部文档:

    db.collection.deleteMany({ b:'Tse先生' })

    删除b等于Tse先生的一个文档:

    db.collection.deleteOne({ b:'Tse先生'})

    提示:在实际操作中,阿里云管理mongo的DMS没法支持deleteOne和deleteMany命令,只能用remove命令。

    3、MongoDB 更新文档(改)

    3.1、MongoDB 使用 update() 和 save() 方法来更新集合中的文档。

    update() 方法用于更新已存在的文档。语法格式如下:

    db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>,
         multi: <boolean>,
         writeConcern: <document>,
         collation: <document>,
         arrayFilters: [ <filterdocument1>, ... ],
         hint:  <document|string>        // Available starting in MongoDB 4.2
       }
    )

    参数说明:

    • query : update的查询条件,类似sql update查询内where后面的。
    • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern :可选,抛出异常的级别。
    • collation:可选,归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
    • arrayFilters:可选的。筛选器文档数组,用于确定要对数组字段进行更新操作要修改的数组元素。
    • hint:可选的。指定用于支持查询谓词的索引的文档或字符串。该选项可以采用索引规范文档或索引名称字符串。如果指定的索引不存在,则操作错误。(4.2版本新功能)

    实例:

    collection这个文档表里面有两条数据,现在把a=4这条改为a=6

    db.collection.update({'a':'4'},{$set:{'a':'6'}})
    
    #输出消息
    WriteResult({
        "nMatched" : 1,
        "nUpserted" : 0,
        "nModified" : 1,
        "writeConcernError" : [ ]
    })

    update后的表数据,显示a已经是6了:

    以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

    db.collection.update({'a':'4'},{$set:{'a':'6'}},{multi:true})

    3.2、MongoDB弃用该db.collection.save()方法。

    而是使用db.collection.insertOne()或 db.collection.replaceOne()代替。

    db.collection.save(
       <document>,
       {
         writeConcern: <document>
       }
    )

    参数说明:

    • document : 文档数据。
    • writeConcern :可选,抛出异常的级别。
    db.collection.save({'_id':'5dbb9fd31a2300006c0050c7','a':'7','b':'Tse女士','c':'30岁'})
    WriteResult({ "nMatched" :
    0, "nUpserted" : 1, "nModified" : 0, "_id" : "5dbb9fd31a2300006c0050c7", "writeConcernError" : [ ] })

    3.2版中的新功能。

    将文档插入集合中。

    该insertOne()方法具有以下语法:

    db.collection.insertOne(
       <document>,
       {
          writeConcern: <document>
       }
    )
    db.collection.insertOne({'_id':'5dbb9fd31a2300006c0050c8','a':'8','b':'Tse女士','c':'31岁'})

    4、MongoDB 查询文档(查)

    MongoDB 查询文档使用 find() 方法。

    4.1、find() 方法以非结构化的方式来显示所有文档。

    语法;

    db.collection.find(query, projection)
    • query :可选,使用查询操作符指定查询条件
    • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

    如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

    db.collection.find().pretty()

    pretty() 方法以美化脚本格式化的方式来显示所有文档。

    查询实例:

    db.collection.find().pretty()
    {
      "_id": ObjectId("5dbb9fd31a2300006c0050c6"),
      "a": "6",
      "b": "Tse先生",
      "c": "22岁"
    }
    {
      "_id": ObjectId("5dbb9fd31a2300006c0050c7"),
      "a": "5",
      "b": "Tse先生",
      "c": "23岁"
    }
    {
      "_id": "5dbb9fd31a2300006c0050c7",
      "a": "7",
      "b": "Tse女士",
      "c": "30岁"
    }
    {
      "_id": "5dbb9fd31a2300006c0050c8",
      "a": "8",
      "b": "Tse女士",
      "c": "31岁"
    }
    Fetched 4 record(s) in 1565ms

    4.2、findOne() 方法,它只返回一个文档,不能加pretty

    db.collection.findOne()
    {
      "_id": ObjectId("5dbb9fd31a2300006c0050c6"),
      "a": "6",
      "b": "Tse先生",
      "c": "22岁"
    }

    4.3、MongoDB 与 (关系型数据库)RDBMS Where 语句比较

    如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

    操作格式范例关系型数据库RDBMS中的类似语句
    等于 {<key>:<value>} db.col.find({"by":"Tse先生"}).pretty() where by = 'Tse先生'
    小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:100}}).pretty() where likes < 100
    小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:100}}).pretty() where likes <= 100
    大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:100}}).pretty() where likes > 100
    大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:100}}).pretty() where likes >= 100
    不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:100}}).pretty() where likes != 100

    4.4、MongoDB AND 条件

    MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

    语法格式如下:

    db.collection.find({key1:value1, key2:value2}).pretty()

    实例:

    下面实例通过_id和a键来查询collection文档表数据

    db.collection.find({'_id':'5dbb9fd31a2300006c0050c7', 'a':'7'}).pretty()
    {
      "_id": "5dbb9fd31a2300006c0050c7",
      "a": "7",
      "b": "Tse女士",
      "c": "30岁"
    }
    Fetched 1 record(s) in 2ms

    以上实例中类似于SQL中WHERE 语句:WHERE _id='5dbb9fd31a2300006c0050c7' AND a='7'

    4.5、MongoDB OR 条件

    MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

    db.collection.find(
       {
          $or: [
             {key1: value1}, {key2:value2}
          ]
       }
    ).pretty()

    以下实例中,查询键_id或者a键collection的文档表数据。

    db.collection.find({$or:[{'_id':'5dbb9fd31a2300006c0050c7'},{'a':'7'}]}).pretty()
    {
      "_id": "5dbb9fd31a2300006c0050c7",
      "a": "7",
      "b": "Tse女士",
      "c": "30岁"
    }

    以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: where a>=5 AND (_id = '5dbb9fd31a2300006c0050c7' OR b = 'Tse先生')

    db.collection.find({"a": {$gt:4}, $or: [{"_id":"5dbb9fd31a2300006c0050c6"},{"b": "Tse先生"}]}).pretty()
  • 相关阅读:
    大脑不清醒什么原因?
    时间同步linux和window
    NTP服务及时间同步(CentOS6.x)
    刚刚我差点被银行信用卡分期给骗了!
    信用卡分期推销太烦人?你可以这样破解
    为何打印机里有一个文档一直等待打印,删不掉?
    win7下如何显示缅文和使用缅文输入法?
    win7如何连接蓝牙键盘
    @Autowired @Transaction @Service同时出现。
    Eclipse中设置格式化jsp自动换行
  • 原文地址:https://www.cnblogs.com/Sungeek/p/10863771.html
Copyright © 2020-2023  润新知