【问题标题】:Yet another MongoDB findAndModify另一个 MongoDB findAndModify
【发布时间】:2013-12-27 03:05:13
【问题描述】:

请考虑以下文档,它是运行时集合的一部分:

{
"entity_id" : 10,
"features" : [ 
    {
        "10" : "Test System 2"
    }, 
    {
        "20" : "System 2 Description"
    }, 
    {
        "180" : ISODate("2013-12-25T18:19:40.589Z")
    }, 
    {
        "190" : ISODate("2013-12-25T18:19:40.589Z")
    }
],
"_id" : ObjectId("52bb21bc8a2ebdc01c000001")
}

我的目标是更新具有键“20”的“功能”数组元素的值。 以下是我尝试过的东西(在 mongo shell 中):

db.Runtime.findAndModify({ "query" : {"_id": "52bb21bc8a2ebdc01c000001"}, "update" : {$set      : {"features.$.20":"Updated Description"}}} );

db.Runtime.findAndModify({ "query" : {"_id": "52bb21bc8a2ebdc01c000001"}, "update" : {$set : {"features['20']":"Updated Description"}}} );

db.Runtime.findAndModify({ "query" : {"_id": "52bb21bc8a2ebdc01c000001"}, "update" : {$set : {"features[1]":"Updated Description"}}} );

在所有情况下,shell 都会打印 无效的 并且数据没有任何反应。所以,主要问题当然是我的代码 sn-ps 有什么问题。另外,应该如何解释“null”?有没有像 mongo shell's log 这样的东西可以找到任何线索?非常感谢您的帮助!

【问题讨论】:

    标签: mongodb shell findandmodify


    【解决方案1】:

    在更新中使用$ 位置运算符时,您的查询需要包含与您要更新的数组元素匹配的术语:

    db.Runtime.findAndModify({
        query: {_id: ObjectId("52bb21bc8a2ebdc01c000001"), 
                'features.20': {$exists: true}}, 
        update: {$set: {"features.$.20":"Updated Description"}}
    })
    

    请注意,您还需要在 _id 字符串上调用 ObjectId 以将其转换为实际的 ObjectId,否则它将与文档不匹配。

    【讨论】:

    • 正确,谢谢一百万!对我的另外两个“子问题”有什么想法吗?
    猜你喜欢
    • 2017-03-11
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2015-11-18
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多