MongoDB – db.collection.bulkWrite() 方法
MongoDB 是一个多功能的基于文档的 NoSQL 数据库,能够通过它的bulkWrite()方法有效地执行数据库写入操作。这意味着可以一次性插入/更新/删除多个文档。
- 此方法可用于多文档事务。
- 如果此方法在事务中遇到错误,则会抛出 BulkWriteException。
- 默认情况下,此方法按顺序执行操作。
句法 :
db.collection.bulkWrite(
[
{
writeConcern :
ordered :
}
)
参数:
- [
, 是一个写操作数组,即insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne。, ..., ]: - writeConcern:它是一个表达写关注的文档。如果你想使用默认的写关注然后删除这个参数,它是一个可选参数。
- ordered:由于可以执行多个操作,当没有提供ordered(默认为true)时,所有操作将一个一个进行,如果按ordered :false 给出,操作的结果会有所不同,因为有时insertOne 将是第一个,然后是其余的,有时是 deleteOne 紧随其后,如果是这种情况,没有任何文档存在,则无法完成。因此,无论是否需要,都应考虑向 false 提供“有序”参数
返回:
此方法将返回一个包含布尔值的文档,该布尔值被确认为 true(如果启用了写关注)或 false(如果禁用了写关注),为每个写操作计数,并为每个成功插入包含一个 _id 的数组或上传文件。
写操作:
现在让我们了解写操作:
在以下写操作中,我们正在使用:
Database: studentsdb
Collection: students
Document: three documents that contain the details of the students.
1.insertOne操作:
insertOne 用于在集合中插入一个文档。
句法:
db.collection.bulkWrite([{insertOne: {“document” :
例子:
让我们应用插入 2 个文档并检查它的输出:
try{
… db.students.bulkWrite([
… {insertOne:{“document”:{studentId:4, studentName:”GeekD”, studentAge:24}}},
… {insertOne:{“document”:{studentId:4, studentName:”GeekD”, studentAge:24}}}
… ]);
… }catch(e){
… print(e);
… }
由于上面的查询包含两个“insertOne”语句,因此正确插入了 2 个文档。这里,“insertedids”代表插入的值。现在,n次执行find(),我们可以看到新文档完美插入
“_id”列是唯一标识文档的列。在我们的示例中,对于 _id,随机选取值。我们可以将 _id 的值显式设置为 1、2 等,_id 列的行为类似于主键概念,因此不允许插入重复的行。
2. updateOne 和 updateMany 操作:
更新一 用于更新集合中的一个文档。
句法:
db.collection.bulkWrite([{updateOne :
{“filter”:
“update”:
“upsert”:
“collation”:
“arrayFilters”:[
“hint”:
}
}])
例子:
我们需要提供有效的过滤条件,即需要正确检查列(mongodb 区分大小写)并提供要更新的列。
try {
db.students.bulkWrite([
{ updateOne : {
"filter" : { "studentId" : 2 },
"update" : { $set : { "studentName" : "GeekyBest" } }
} }
]);
} catch (e) {
print(e);
}
在这里,首先“过滤”“studentId = 2”,如果存在,则使用“updateOne”将“studentName”更新为“GeekyBest”。如果多个文档与给定过滤匹配,则“updateOne”更新集合中与给定条件匹配的第一个文档。因此,在上述过程中,对一个文档进行了更新。 “studentId”和“studentid”被区别对待,因为 mongodb 区分大小写。
更新很多 用于更新集合中与给定条件匹配的所有文档。
句法:
db.collection.bulkWrite([{updateMany :
{“filter”:
“update”:
“upsert”:
“collation”:
“arrayFilters”:[
“hint”:
}
}])
例子:
try {
db.students.bulkWrite([
{ updateMany : {
"filter" : { "studentId" : 4 },
"update" : { $set : { "studentName" : "GeeksForGeeksbest" } }
} }
]);
} catch (e) {
print(e);
}
“matchedCount”表示匹配了多少文档,它显示为 1,因为 1 个文档与过滤条件匹配,因此匹配的文档“studentName”发生了变化。
3.replaceOne操作:
replaceOne 根据过滤器中提供的匹配替换单个文档。即使匹配多个文档,replaceOne 也将始终替换第一个匹配的文档。
句法:
db.collection.bulkWrite([{replaceOne :
{“filter”:
“replacement”:
“upsert”:
“collation”:
“hint”:
}
}])
例子:
try {
db.students.bulkWrite([
{ replaceOne : {
"filter" : { "studentId" : 3 },
"replacement" : { "studentId" : 30, "studentName" : "BestGeek" }
} }
]);
} catch (e) {
print(e);
}
在上面的示例中,我们检查了“studentId = 3”,并且一个文档与给定的过滤器匹配,并完成了以下替换,即“studentId = 30 和 studentName = BestGeek”是已完成的替换,它们也被替换。
4. deleteOne 和 deleteMany 操作:
deleteOne根据过滤器中提供的匹配删除单个文档。即使匹配多个文档,deleteOne 也只会始终删除第一个匹配的文档。
句法:
db.collection.bulkWrite([{deleteOne :
{“filter”:
“collation”:
}
}])
例子:
try {
db.students.bulkWrite([
{ deleteOne : { "filter" : { "studentId" : 30} } }
]);
} catch (e) {
print(e);
}
在这里,“deleteone”将删除与给定过滤器匹配的文档(即“studentId”:30)
deleteMany将删除所有匹配的文档。因此,这取决于需求,我们需要看看我们是否可以使用 deleteMany。在生产环境中,删除的成本很高,我们不能撤销它,因此在这样做时应该非常小心。
句法:
db.collection.bulkWrite([{deleteMany :
{“filter”:
“collation”:
}
}])
例子:
try {
db.students.bulkWrite([
{ deleteMany : { "filter" : { "studentAge" : 20} } }
]);
} catch (e) {
print(e);
}
在这里,“deleteMany”将删除那些与给定过滤器匹配的文档(即“studentAge”:20)
例子:
在以下示例中,我们正在使用:
Database: studentsdb
Collection: students
Document: four documents that contain the details of the students.
无序批量写入:
这里,bulkWrite 方法执行多个无序操作,因为ordered 参数的值设置为false。
try {
db.students.bulkWrite([
{insertOne:{"document":{studentId:5, studentName:"GeekE", studentAge:24}}},
{ updateOne : {
"filter" : { "studentId" : 2 },
"update" : { $set : { "studentName" : "GeekyBest" } }
} },
{ deleteMany : { "filter" : { "studentAge" : 20} } },
{ replaceOne : {
"filter" : { "studentId" : 3 },
"replacement" : { "studentId" : 30, "studentName" : "BestGeek" }
} }
],{ ordered : false });
} catch (e) {
print(e);
}
订购批量写入:
如果ordered参数的值设置为true,那么从insertOne开始,所有的操作都一一执行。那就是批量写入 将从 insertOne、updateOne、updateMany、replaceOne、deleteOne 开始执行,最后是 deleteMany。 “ordered”的默认选项是“true”。但如果根据需要将其设置为“false”,结果可能会不时变化。即无法定义执行顺序,因此有时会计算出 deleteOne/deleteMany,然后 insertOne/updateOne 或其余的将发生。
try {
db.students.bulkWrite([
{insertOne:{"document":{studentId:5, studentName:"GeekE", studentAge:24}}},
{ updateOne : {
"filter" : { "studentId" : 2 },
"update" : { $set : { "studentName" : "GeekyBest" } }
} },
{ deleteMany : { "filter" : { "studentAge" : 20} } },
{ replaceOne : {
"filter" : { "studentId" : 3 },
"replacement" : { "studentId" : 40, "studentName" : "Geek11" }
} }
],{ ordered : true });
} catch (e) {
print(e);
}