猫鼬必须具有仅更新具有值的字段的解决方案,即使您传递了更多字段

时间:2018-11-01 05:47:15

标签: node.js mongodb express mongoose

我有一个真正的脑筋急转弯...对我来说很好。

我有一个集合,其中所有文档都具有相同的字段,但可能并非每个文档都包含值。

例如:

doc1{
    twitter: '*********',
    facebook: '*********',
    linkedin: '*********'
}

doc2{
    twitter: '*********'
}

doc3{
    facebook: '*********',
    linkedin: '*********'
}

我的挑战是我想做一个'updateMany'函数,我可能要传递这样的内容:

updateMany(){
    twitter: '########',
    facebook: '########',
    linkedin: '########'
}

并且我只想更新文档中已经具有值的字段,而不更新所有字段,因此每个文档最终每个字段都有一个值。

所以它看起来像这样:

doc1{
    twitter: '########',
    facebook: '########',
    linkedin: '########'
}

doc2{
    twitter: '########'
}

doc3{
    facebook: '########',
    linkedin: '########'
}

我不确定在不遍历每个记录和每个字段的情况下如何执行此操作,这似乎过于复杂。

在这种情况下猫鼬必须有东西... ???

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试使用$exists运算符,但不能将所有这些更新合并到一个数据库调用中,因为不同的文档会根据属性而受到影响(这是因为您分别指定了过滤条件和更新定义),但是您可以在JS中动态构建该查询:

let newDoc = {
    twitter: '########',
    facebook: '########',
    linkedin: '########'
};

Object.keys(newDoc).forEach(async (key) => {
    await Model.updateMany({ [key]: { $exists: true} }, { $set: { [key]: newDoc[key] } });
});