我在更新MongoDB中的数组元素时遇到了问题。这是文档的结构:
{
"_id" : ObjectId("57e2645e11c979157400046e"),
"site" : "BLABLA",
"timestamp_hour" : 1473343200,
"values" : [
{
"1473343200" : 66
},
{
"1473344100" : 230
},
{
"1473345000" : 479
},
{
"1473345900" : 139
}
]
}
现在我想用键" 1473345900"更新元素。我怎样才能做到这一点?我试过了:
db.COLLECTIONNAME.update({"values.1473345900": {$exists:true}}, {$set: {"values.$": 0}})
但在那之后文件看起来像:
{
"_id" : ObjectId("57e2645e11c979157400046e"),
"site" : "BLABLA",
"timestamp_hour" : 1473343200,
"values" : [
{
"1473343200" : 66
},
{
"1473344100" : 230
},
{
"1473345000" : 479
},
0
]
}
我做错了什么?我只想将1473345900的值更新为任何值......我不想更新完整的元素...
非常感谢!!!
答案 0 :(得分:2)
您需要在更新中添加与要更新的数组元素匹配的其他查询。典型的查询将涉及检查元素的值不等于正在更新的值。
以下示例更新显示了 $
位置运算符标识散列键数组元素{ "1473345900": 139 }
的正确索引位置的位置。如果您尝试在没有 $
位置运算符的情况下运行更新操作:
db.COLLECTIONNAME.update(
{ "values.1473345900": { "$exists": true } },
{ "$set": { "values.1473345900": 0 } }
)
mongo会将时间戳1473345900视为索引位置,因此您将收到错误
无法将数组回填到大于1500000个元素
因此,正确的方法应该是:
var val = 32;
db.COLLECTIONNAME.update(
{ "values.1473345900": { "$ne": val, "$exists": true } },
{ "$set": { "values.$.1473345900": val } }
)