我正在从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()不允许中间逻辑。有人找不到我似乎找不到的文档吗?
答案 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)
});
});