0

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

{
"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 都会打印 null 并且数据没有任何反应。所以,主要问题当然是我的代码片段有什么问题。另外,应该如何解释“null”?有没有像 mongo shell's log 这样的东西可以找到任何线索?非常感谢您的帮助!

4

1 回答 1

1

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

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

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

于 2013-12-26T18:58:57.657 回答