MongoDB基础之文档DML操作

2022-11-07  本文已影响0人  上善若泪

1 文档DML

主要讲解的是文档的创建,更新,删除等相关操作

1.1 定义

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点

下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )

需要注意的是:

文档键命名规范:

1.2 插入文档

由于文档的数据结构和JSON基本一样。所有存储在集合中的数据都是 BSON 格式。BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

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

db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.insertOne(document) 
或
db.COLLECTION_NAME.insertMany(document) 
或
db.COLLECTION_NAME.save(document)

插入语法格式:

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

参数说明:

实例
以下文档可以存储在 MongoDB 的 test数据库 的 col 集合中:

db.test.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'myself',
    url: 'http://www.test.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

以上实例中 test是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。

我们也可以将数据定义为一个变量,如下所示:

document=({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'myself',
    url: 'http://www.test.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
});

执行后显示结果如下:

document=({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'myself',
    url: 'http://www.test.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
});

执行插入操作:

db.test.insert(document)
WriteResult({ "nInserted" : 1 })

1.3 更新文档

使用 update()save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。

1.3.1 update() 方法

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

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:

接着我们通过 update() 方法来更新标题(title):

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息

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

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

附:

1.3.2 save() 方法

save()方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:

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

参数说明:

db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "myself",
    "url" : "http://www.test.com",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})

1.3.3 原子操作命令

MongoDB原子操作常用命令,如:$set$unset$inc

1.3.4 位置操作符

1.3.4.1 位置操作符$

位置操作符$,如果不知道数组中元素的位置,可以使用位置$操作符
位置$操作符充当更新文档查询中第一个匹配的占位符,即使用了multi:true也没用
$可以在不显示指定数组元素位置的情况下标识要更新的数组中的元素,$只是单个占位符
.$[].会更新数组内全部元素,可以多个。.$.只会更新符合查询条件的数组内的元素,有且只能有一个

先查询
t.find() 
 { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
更新 
t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
再查询 
t.find() 
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

1.3.4.2 位置操作符$[]

位置操作符$[],要更新数组中的所有元素
查询条件匹配的情况下,$[]会修改指定数组字段中的所有元素
因为$[]修改整个数组。所以无需在查询条件中指定数组
注:3.6版本后的新功能

语法格式如下:

db.collection.updateMany(
   { <query conditions> },
   { <update operator>: { "<array>.$[]" : value } }
)

案例:

插入
db.stu.insert({_id:1,grades:[80,85,90]})
db.stu.insert({_id:2,grades:[88,90,92]})
db.stu.insert({_id:3,grades:[85,100,90]})
更新:
db.stu.update({grades:85},{$set:{'grades.$[]':'修改'}},{multi:true})

1.3.4.3 位置操作符$[< identifier >]

会使用一个或多个数组作为过滤条件进行匹配
在monodb3.6版本后才可使用
过滤后的位置运算符$[<identifier>]标识与arrayFilters条件匹配的数组元素来进行更新操作。
位置$[identifier]运算符充当数组字段中arrayFilters中指定条件匹配的所有元素的占位符

语法:

db.collection.update(
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
或者:
db.collection.update(
   { <query selector> },
   { <update operator>: { "array.$[<identifier>].field" : value } },
   { arrayFilters: [ { <identifier>: <condition> } } ] }
)

注意:在<identifier>必须以小写字母开头,并且只包含字母数字字符

1.3.4.4 $elemMatch()

位置操作符$能够更新第一个匹配的数组元素,但是通过$elemMatch()操作符匹配多个内嵌文档的查询条件
考虑如下的stu集合文档grades字段是一个嵌套字段的文档

{
  _id: 4,
  grades: [
     { grade: 80, mean: 75, std: 8 },
     { grade: 85, mean: 90, std: 5 },
     { grade: 90, mean: 85, std: 3 }
  ]
}

如下语句会更新嵌套文档中的std值为6,条件是文档的主键是4,字段grades的嵌套文档字段grade字段值小于等于90mean字段值大于80

db.students.update(
   {
     _id: 4,
     grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
   },
   { $set: { "grades.$.std" : 6 } }
)

1.4 MongoDB 删除文档

MongoDB remove() 函数是用来移除集合中的数据。
MongoDB 数据更新可以使用 update()函数。在执行 remove() 函数前先执行 find() 命令来判断执行的条件是否正确

db.collection.remove(
   <query>,
   <justOne>
)

参数说明:

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

删除集合下全部文档:
db.test.deleteMany({})

删除 status 等于 A 的全部文档:
db.test.deleteMany({ status : "A" })

删除 status 等于 D 的一个文档:
db.test.deleteOne( { status: "D" } )
上一篇 下一篇

猜你喜欢

热点阅读