另一个MongoDB findAndModify

时间:2013-12-26 18:45:16

标签: mongodb shell findandmodify

请考虑以下文档,即Runtime集合的一部分:

{
"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”的“features”数组元素的值。 以下是我尝试过的东西(在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”?有没有mongo shell的日志可以找到任何线索?非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

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

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

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