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

标签 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: '########'
}

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

Mongoose 必须有适合这种情况的东西......???

谢谢!

最佳答案

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

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

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

关于node.js - Mongoose 必须有一个解决方案,仅更新具有值的字段,即使您传递更多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53095789/

相关文章:

mongodb聚合总和项作为嵌套数据

mongodb - TypeORM FindById 不适用于 MongoDB

express - iRedMail 在标准安装后阻止自定义端口

node.js - Neo4j 日期时间验证错误

javascript - 如何从 Google Forms 弹出下拉列表中选择一个选项 Puppeteer NodeJS

node.js - mongodb 中的多个组聚合

mongodb - mongo_mapper 或 mongoid 与 Rails4

javascript - 从 mongodb 作为文档检索对象类型后如何获取对象类型?

mongodb - 在 Sitecore xDB 中存储自定义临时数据

javascript - ElasticSearch Nodejs Express 自动化测试