Node.js Mongoose必须有一个只更新具有值的字段的解决方案,即使您传递了更多字段

Node.js Mongoose必须有一个只更新具有值的字段的解决方案,即使您传递了更多字段,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我有一个真正的脑筋急转弯。。。对我来说很好 我有一个集合,其中所有文档都有相同的字段,但不一定都包含每个字段的值 例如: doc1{ twitter: '*********', facebook: '*********', linkedin: '*********' } doc2{ twitter: '*********' } doc3{ facebook: '*********', linkedin: '*********' } 我的挑战是

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

我有一个集合,其中所有文档都有相同的字段,但不一定都包含每个字段的值

例如:

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

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

doc3{
    facebook: '*********',
    linkedin: '*********'
}
我的挑战是,我想做一个“updateMany”函数,在这个函数中,我可以传递如下内容:

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

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

doc3{
    facebook: '########',
    linkedin: '########'
}
我只想更新文档中已经有值的字段,而不是更新所有字段,这样每个文档的每个字段都有值

所以看起来是这样的:

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

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

doc3{
    facebook: '########',
    linkedin: '########'
}
我不知道如何在不遍历每条记录和每个字段的情况下做到这一点,这似乎过于复杂了

猫鼬一定有适合这种情况的东西

谢谢

您可以尝试使用operator,但不能将所有这些更新合并到一个数据库调用中,因为不同的文档会受到属性的影响(这是因为您分别指定了筛选条件和更新定义),但是您可以在JS中动态生成该查询:

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

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