【问题标题】:MongoDB: Updating document in array with dictionaryMongoDB:使用字典更新数组中的文档
【发布时间】:2021-09-28 23:08:36
【问题描述】:

我找到了一个StackOverflow Question,它非常接近于回答我的问题,但还不够。

回答这个原始问题(修改数组中的文档),但假设您没有想要进行的特定更改。相反,我有一本我希望做出的改变的字典。这是一个例子:

原始文件

{
    _id: something,
    recipients: [{id:1, name:"Andrey", isread:false}, {id:2, name:"John", isread:false}]
}

要进行的更改

{
    isread: true,
    fullname: 'jonathan'
}

如何将这本更改字典应用到 John (id:2)? 如果它是相关的,我正在使用MongoDB-Node.JS Driver 谢谢

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    就像您提到的问题一样,您需要使用$ positional operator,但在这种情况下使用update

    collection.update({_id:something, 'recipients.id': 2}, {$set: {'recipients.$': {
        isread: true,
        fullname: 'jonathan'
    }}}, function (err) {...
    

    编辑

    要不替换整个数组元素对象,您必须执行以下操作:

    collection.update({_id:something, 'recipients.id': 2}, {$set: {
        'recipients.$.isread': true,
        'recipients.$.fullname': 'jonathan'
    }}, function (err) {...
    

    【讨论】:

    • 它几乎可以正常工作,但是整个文档正在被替换。这是一个更具体的示例:gist.github.com/3298315
    • 我提交了一个编辑,但它正在等待同行评审。您可以多次使用位置运算符,因此您可以单独设置 "recipients.$.isread""recipients.$.fullName" 字段,而不是将整个嵌入文档设置在该位置。
    • 这是否意味着我必须为字典中的每个字段提交更新?不幸的是,我不知道哪些字段会提前更新,这就是为什么我尝试只使用更改字典。
    • @tgrosinger 您可以根据您所称的更改字典动态构建您的$set 对象。
    • 啊完美。我将浏览字典并更新提供给我的密钥并在“recipients.$.”前面添加。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2016-11-23
    • 2016-11-04
    • 2016-12-18
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多