我们已经介绍过MongoDB中文档的增删改查等操作,但在有一些场景下,我们想同时完成插入、删除、更新等操作,显然是没有办法实现的。但是MongoDB给我们提供了这样的方式,可以使用db.collection.bulkWrite()方法实现批量插入、更新和删除操作。
下面我们来了解一下批量写操作的语法:
db.collection.bulkWrite([
其中,
collection:指的是集合名称
operation:指的是操作,目前支持的操作有:insertOne, updateOne, updateMany, replaceOne, deleteOne, deleteMany。
options:选填,指的是其他一些选项。
ordered 选项: 默认为true:批量操作中某个操作执行失败,后面的操作将不再执行。
false:批量操作中某个操作执行失败,后面的操作仍然执行。
【注意】ordered并不能保证事务完整性,批量操作并不能保证事务完整性。
示例:
我们准备一下初始化文档:
db.test.insertMany(
[
{ "_id" : "1001", "name" : "张三", "fruits" : [ "apple", "orange" ] },
{ "_id" : "1002", "name" : "李四", "fruits" : [ "banana", "apple" ] },
{ "_id" : "1003", "name" : "王五", "fruits" : [ "banana", "apple", "orange" ] }
]
);
下面我们插入两条数据,更新一条数据,删除一条数据,替换一条数据:
db.test.bulkWrite([
{
insertOne: {
document: {
"_id" : "1004",
"name" : "1004",
"fruits" : [ "apple" ],
"add_comment" : "我是新增加的"
}
}
},
{
insertOne: {
document: {
"_id" : "1005",
"name" : "1005",
"fruits" : [ "orange" ],
"add_comment" : "我是新增加的"
}
},
},
{
updateMany: {
filter: { "fruits": "apple" },
update: { $set: { "update_comment": "I has apple" } }
}
},
{
deleteOne: {
filter: { "name": "张三"}
}
},
{
replaceOne: {
filter: { "name": "李四" },
replacement: { "replace_commet": "我被替换掉了" }
}
}
], { ordered: false })
执行完成后,查询文档:
{ "_id" : "1002", "replace_commet" : "我被替换掉了" }
{ "_id" : "1003", "name" : "王五", "fruits" : [ "banana", "apple", "orange" ], "update_comment" : "I has apple" }
{ "_id" : "1004", "name" : "1004", "fruits" : [ "apple" ], "add_comment" : "我是新增加的", "update_comment" : "I has apple" }
{ "_id" : "1005", "name" : "1005", "fruits" : [ "orange" ], "add_comment" : "我是新增加的" }
(1)编号为1004,1005的插入到了文档中
(2)编号为1003,1004的文档被更新了,说明批量写入操作时新插入的数据只要满足后面的操作也会被执行。
(3)编号为1001的数据被删除
(4)编号为1002的数据被替换