请考虑以下文档,即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的日志可以找到任何线索?非常感谢你的帮助!
答案 0 :(得分:1)
在更新中使用$
位置运算符时,您的查询需要包含一个与您要更新的数组元素匹配的术语:
db.Runtime.findAndModify({
query: {_id: ObjectId("52bb21bc8a2ebdc01c000001"),
'features.20': {$exists: true}},
update: {$set: {"features.$.20":"Updated Description"}}
})
请注意,您还需要在ObjectId
字符串上调用_id
将其变为实际ObjectId
,否则将与该文档不匹配。