📜  MongoDB – db.collection.bulkWrite() 方法

📅  最后修改于: 2022-05-13 01:56:58.327000             🧑  作者: Mango

MongoDB – db.collection.bulkWrite() 方法

MongoDB 是一个多功能的基于文档的 NoSQL 数据库,能够通过它的bulkWrite()方法有效地执行数据库写入操作。这意味着可以一次性插入/更新/删除多个文档。

  • 此方法可用于多文档事务。
  • 如果此方法在事务中遇到错误,则会抛出 BulkWriteException。
  • 默认情况下,此方法按顺序执行操作。

句法 :

参数:

  • [ , , ..., ]:是一个写操作数组,即insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne。
  • writeConcern:它是一个表达写关注的文档。如果你想使用默认的写关注然后删除这个参数,它是一个可选参数。
  • ordered:由于可以执行多个操作,当没有提供ordered(默认为true)时,所有操作将一个一个进行,如果按ordered :false 给出,操作的结果会有所不同,因为有时insertOne 将是第一个,然后是其余的,有时是 deleteOne 紧随其后,如果是这种情况,没有任何文档存在,则无法完成。因此,无论是否需要,都应考虑向 false 提供“有序”参数

返回:

此方法将返回一个包含布尔值的文档,该布尔值被确认为 true(如果启用了写关注)或 false(如果禁用了写关注),为每个写操作计数,并为每个成功插入包含一个 _id 的数组或上传文件。

写操作:



现在让我们了解写操作:

在以下写操作中,我们正在使用:

1.insertOne操作:

insertOne 用于在集合中插入一个文档。

句法:

例子:

让我们应用插入 2 个文档并检查它的输出:

由于上面的查询包含两个“insertOne”语句,因此正确插入了 2 个文档。这里,“insertedids”代表插入的值。现在,n次执行find(),我们可以看到新文档完美插入

“_id”列是唯一标识文档的列。在我们的示例中,对于 _id,随机选取值。我们可以将 _id 的值显式设置为 1、2 等,_id 列的行为类似于主键概念,因此不允许插入重复的行。

2. updateOne 和 updateMany 操作:

更新一 用于更新集合中的一个文档。

句法:

例子:

我们需要提供有效的过滤条件,即需要正确检查列(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 区分大小写。



更新很多 用于更新集合中与给定条件匹配的所有文档。

句法:

例子:

try {
  db.students.bulkWrite([
     { updateMany : {
        "filter" : { "studentId" : 4 },
        "update" : { $set : { "studentName" : "GeeksForGeeksbest" } }
     } }
  ]);
} catch (e) {
  print(e);
}   

“matchedCount”表示匹配了多少文档,它显示为 1,因为 1 个文档与过滤条件匹配,因此匹配的文档“studentName”发生了变化。

3.replaceOne操作:

replaceOne 根据过滤器中提供的匹配替换单个文档。即使匹配多个文档,replaceOne 也将始终替换第一个匹配的文档。

句法:

例子:

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 也只会始终删除第一个匹配的文档。



句法:

例子:

try {
  db.students.bulkWrite([
     { deleteOne : { "filter" : { "studentId" : 30} } }  
  ]);
} catch (e) {
  print(e);
}

在这里,“deleteone”将删除与给定过滤器匹配的文档(即“studentId”:30)

deleteMany将删除所有匹配的文档。因此,这取决于需求,我们需要看看我们是否可以使用 deleteMany。在生产环境中,删除的成本很高,我们不能撤销它,因此在这样做时应该非常小心。

句法:

例子:

try {
  db.students.bulkWrite([
     { deleteMany : { "filter" : { "studentAge" : 20} } }  
  ]);
} catch (e) {
  print(e);
}

在这里,“deleteMany”将删除那些与给定过滤器匹配的文档(即“studentAge”:20)

例子:

在以下示例中,我们正在使用:

无序批量写入:

这里,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);
}