在MongoDB中插入或更新许多文档

str*_*str 10 mongodb

有没有办法用一个查询插入或更新/替换MongoDB中的多个文档?

假设以下集合:

[
    {_id: 1, text: "something"},
    {_id: 4, text: "baz"}
]
Run Code Online (Sandbox Code Playgroud)

现在我想添加一些可能已经存在于集合中的多个文档.如果文档已经在集合中,我想更新/替换它们.例如,我想插入以下文件:

[
    {_id:1, text: "something else"},
    {_id:2, text: "foo"},
    {_id:3, text: "bar"}
]
Run Code Online (Sandbox Code Playgroud)

查询应插入带有_id2和3 的文档.它还应该用_id1 更新/替换文档.在此过程之后,集合应如下所示:

[
    {_id:1, text: "something else"},
    {_id:2, text: "foo"},
    {_id:3, text: "bar"},
    {_id:4, text: "baz"}
]
Run Code Online (Sandbox Code Playgroud)

一种方法可能是使用insertMany:

db.collection.insertMany(
   [ {...}, {...}, {...} ],
   {
      ordered: false,
   }
)
Run Code Online (Sandbox Code Playgroud)

如果出现重复,则该查询将发出writeErrors包含对象数组的对象,这些对象包含无法插入的文档的索引.我可以通过它们来更新它们.

但这个过程很麻烦.有没有办法在一个查询中插入或更新/替换许多文档?

小智 10

您还可以使用bulkWrite api在单个查询中更新或插入多个文档,下面是一个示例

var ops = []

items.forEach(item => {
    ops.push(
        {
            updateOne: {
                filter: { _id: unique_id },
                update: {
                    $set: { fields_to_update_if_exists },
                    $setOnInsert: { fileds_to_insert_if_does_not_exist }
                },
                upsert: true
            }
        }
    )
})

db.collections('collection_name').bulkWrite(ops, { ordered: false });
Run Code Online (Sandbox Code Playgroud)


6op*_*pko 7

至于说在这里,做你需要,你可以把这样的事情在哪

的script.js

(*警告:未经测试的代码)

use YOUR_DB
var bulk = db.collection.initializeUnorderedBulkOp();
bulk.find( { _id : 1 } ).upsert().update( { $set: { "text": "something else" } } );
bulk.find( { _id : 4 } ).upsert().update( { $set: { "text": "baz" } } );
bulk.find( { _id : 99 } ).upsert().update( { $set: { "text": "mrga" } } );
bulk.execute();
Run Code Online (Sandbox Code Playgroud)

并运行它

mongo <script.js

我不得不这样做,因为我试图更新/插入超过1000个文件因为限制而无法正常工作.

写命令可以接受不超过1000次的操作.mongo shell中的Bulk()操作和驱动程序中的类似方法没有此限制.

资源