Mongo-批量查找和更新整个文档(一个字段除外)

时间:2018-12-05 22:27:32

标签: javascript node.js mongodb mongodb-query

我正在从csv一次对数​​千个文档执行批量更新/更新操作。我用$set更新了整个文档,目前工作正常。

如果该文档存在,我想保留一个字段,该字段仅可从db获得,并且我没有输入权限。因此,我必须在.find()中获取此字段,将其应用于内存中的文档,然后在$set中使用update()更新文档,我似乎无法在其中应用逻辑在bulk.find().update()

之间

这是一个示例片段:

// This is currently the code I'm implementing, works fine
users.forEach((user) => {
  bulk.find({ username: user.username})
  .updateOne({ $set: { user } });
});
bulk.execute();

我想做的是这样的:

// code won't work, this is what I'm attempting to do
users.forEach((user) => {
  bulk.find({ username: user.username}, function (dbUser) {
    if (dbUser) user.email = dbUser.email;
  })
  .updateOne({ $set: { user } });
});

但是,据我所能设计的,bulk.find()。update()不允许中间逻辑。有人找不到我似乎找不到的文档吗?

1 个答案:

答案 0 :(得分:0)

找出解决方案。将find / updateOne与upsert()$setOnInsert结合使用。 因此,这里发生的是我们在数据库中寻找用户,如果他们存在,我们只用$set更新一些字段。 如果用户不在数据库中,我们将其插入$set中的字段以及通过$setOnInsert插入的其余用户对象。如果数据库中已经存在一个用户,则将$set应用于他们,但是他们跳过了$setOnInsert方法。

两个方法之间的键必须互斥才能起作用。

 users.forEach((user) => {
        bulk
            .find(pick(user, 'email', 'username'))
            .upsert()
            .updateOne({
                $set: pick(user, keysToExcludeOnUpsert),
                $setOnInsert: omit(user, keysToExcludeOnUpsert)
            });
    });