如何在mongodb的insertMany中用相同的邮件ID更新已经存在的数据?

问题描述 投票:0回答:1

比如说,我有一些文件,如

[
     {
        fname: "FirstName1",
        lname: "LastName1",
        email: "[email protected]"
     },
     {
        fname: "FirstName2",
        lname: "LastName2",
        email: "[email protected]"
     },
     ...
]

,都已经存在于数据库中。现在我要用insertMany插入多个文档到该数据库中,其中一些对象包含相同的电子邮件ID,比如---------。

[
     {
        fname: "FirstName3",
        lname: "LastName3",
        email: "[email protected]"
     },
     {
        fname: "FirstName4",
        lname: "LastName4",
        email: "[email protected]"
     },
     {
        fname: "FirstName5",
        lname: "LastName5",
        email: "[email protected]"
     },
     ...
]

所以我需要将之前的文档替换成其他字段,其中包含与插入的文档相同的电子邮件ID。所以我想让数据库看起来像这样。

[
     {
        fname: "FirstName4",
        lname: "LastName4",
        email: "[email protected]"
     },
     {
        fname: "FirstName5",
        lname: "LastName5",
        email: "[email protected]"
     },
     {
        fname: "FirstName3",
        lname: "LastName3",
        email: "[email protected]"
     },
     ...
]

是否有任何解决方案。请让我知道.谢谢.

arrays node.js json mongodb bulkinsert
1个回答
0
投票

你不能用insertMany来做。 为此,你需要 使用upsert选项进行批量更新.

下面是两种不同的语法,你需要循环创建批量查询。(可能有排版错误,代码未测试)

var bulk = db.collection_name.initializeUnorderedBulkOp();
bulk.find( { email: "[email protected]" } ).upsert().update( { $set: { fname: "FirstName4", lname: "LastName4", email: "[email protected]" } } );
bulk.find( { email: "[email protected]" } ).upsert().update( { $set: { fname: "FirstName5", lname: "LastName5", email: "[email protected]" } } );
bulk.find( { email: "[email protected]" } ).upsert().update( { $set: { fname: "FirstName3", lname: "LastName3", email: "[email protected]" } } );
bulk.execute();

另一种语法

var ops = []

objectsArray.forEach(item => {
    ops.push(
        {
            updateOne: {
                filter: { email: item .email},
                update: {
                    $set: { fname: item.fname, lname: item.lname, email: item.email }
                },
                upsert: true
            }
        }
    )
})

db.collections('collection_name').bulkWrite(ops, { ordered: false });

如果您使用的是mongoose,请检查 编写文档

© www.soinside.com 2019 - 2024. All rights reserved.