【问题标题】:MongoDB How to update multiple documents based on array of objectsMongoDB如何根据对象数组更新多个文档
【发布时间】:2018-09-05 22:26:29
【问题描述】:

给定对象数组:

const array = [{_id: 1, name: 'one'}, {_id: 2, name: 'two'}]

如何构造一个查询,以便它更新数据库中每个文档的名称字段,其中文档的 id 等于数组对象中的 _id?

这必须在单个查询中完成。 查询必须使用 mongoDB 节点驱动语法。

例如:

// in DB : [{_id: 1, name: null, _id: 2, name: null }]
db.collection('sprints').update(....).then(...)
// after operation:
// in DB: [{_id: 1, name: "one", _id: 2, name: "two" }]

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您是否尝试过这样的构造:

    Promise.all(array.map(entry =>
        db.collection('sprints').findOneAndUpdate({ _id: entry._id }, { name: entry.name }).save()
    )).then(...);
    

    这不是直接的方式,但对我有用(在测试用例中)

    【讨论】:

    • 这真的是唯一的方法吗?这将执行与数组中的元素一样多的查询:(
    • 理论上这是唯一的方法。也许直接有一个功能,但我在文档中找不到它。但最后猫鼬会对每个条目进行一次查询,所以无论如何都没关系。但你是对的,它绝对不是一个干净的结构
    • 您的查询现在对我来说可能没问题...但是我在 sprint 对象上有其他键...并且它们被只有 _id 和名称的对象覆盖...您可以修改您的查询,以便只修改名称(保留任何其他键)?
    • 已修改为 db.collection('sprints').findOneAndUpdate({ _id: new ObjectID(sprint._id) }, { $set : { name: sprint.name} }) 。保留其他密钥。
    • 将等着看是否有人可以提供单个查询解决方案,如果没有我会接受您的回答
    猜你喜欢
    • 2013-06-22
    • 2021-01-16
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2021-12-04
    • 2021-08-08
    相关资源
    最近更新 更多