MongoDB批量写操作

本文将介绍MongoDB批量写操作,即 db.collection.bulkWrite() 方法。

New in version 3.2.

MongoDB为客户端提供了批量执行写入操作的能力。批量写入操作会影响单个集合。db.collection.bulkWrite() 方法提供了执行批量插入、更新和删除操作的能力。MongoDB 还支持通过 db.collection.insertMany() 方法进行批量插入。

有序与无序操作

批量写入操作可以是有序的,也可以是无序的。

使用有序的操作列表,MongoDB 依次执行操作。如果在处理其中一个写操作过程中发生错误,MongoDB 将返回,而不会处理列表中任何剩余的写操作。

对于无序的操作列表,MongoDB 可以并行执行这些操作,但这种行为并不能得到保证。如果在处理其中一个写操作时发生错误,MongoDB 将继续处理列表中剩余的写操作。

对已分割的集合(sharded collection)执行有序操作列表通常比执行无序列表慢,因为对于有序列表,每个操作都必须等待上一次操作完成

默认情况下,bulkWrite() 方法执行的是有序操作。若要指定无序写入操作,可在 options 中设置 “ordered:false”。

bulkWrite() 方法

bulkWrite() 支持以下写操作:

  • insertOne:插入一个文档

  • updateOne:更新一个文档

  • updateMany:更新多个文档

  • replaceOne:替换一个文档

  • deleteOne:删除一个文档

  • deleteMany:删除多个文档

每个写操作都作为数组中的文档传递给 bulkWrite()。

例如:以下代码执行多个写操作。如下:

(1)向 characters 集合添加数据,如下:

# 插入数据到 characters 集合
db.characters.insert({ "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 });
db.characters.insert({ "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 });
db.characters.insert({ "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 });

# characters 集合的结果
> db.characters.find();
{ "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 }
{ "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 }
{ "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 }

(2)使用 bulkWrite() 方法进行批量操作,对 characters 集合执行多个操作:

try {
    db.characters.bulkWrite([
         { insertOne : {
               "document" : {
                  "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
               }
            }
         },
         { insertOne : {
               "document" : {
                  "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3
               }
            }
         },
         { updateOne : {
               "filter" : { "char" : "Eldon" },
               "update" : { $set : { "status" : "Critical Injury" } }
            }
         },
         { deleteOne : {
                "filter" : { "char" : "Brisbane"}
            }
         },
         { replaceOne : {
               "filter" : { "char" : "Meldane" },
               "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 }
            }
         }
    ]);
} catch (e) {
   print(e);
}

该操作返回以下内容:

{
    "acknowledged" : true,
    "deletedCount" : 1,
    "insertedCount" : 2,
    "matchedCount" : 2,
    "upsertedCount" : 0,
    "insertedIds" : {
        "0" : 4,
        "1" : 5
    },
    "upsertedIds" : {
    }
}
睡眠和休息丧失了时间,却取得了明天工作的精力。 —— 毛泽东
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号