Php 如何更新MongoDB文档中的数组元素

Php 如何更新MongoDB文档中的数组元素,php,mongodb,nosql,Php,Mongodb,Nosql,我在更新MongoDB中的数组元素时遇到问题。这是文档的结构: { "_id" : ObjectId("57e2645e11c979157400046e"), "site" : "BLABLA", "timestamp_hour" : 1473343200, "values" : [ { "1473343200" : 66

我在更新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的值更新为任何值。。。我不想更新完整的元素


非常感谢

您需要在更新中添加与要更新的数组元素匹配的附加查询。典型的查询需要检查元素的值是否不等于正在更新的值

下面的更新示例显示了这种情况,
$
位置运算符标识哈希键数组元素
{“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 } }
)

您需要在更新中添加与要更新的数组元素匹配的附加查询。典型的查询需要检查元素的值是否不等于正在更新的值

下面的更新示例显示了这种情况,
$
位置运算符标识哈希键数组元素
{“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 } }
)

问题是:我不知道1473345900是否已经存在。因此1)我必须找出1473345900是否存在,2)我必须更新1473345900的值。抱歉,我没有解释…
db.sites.update({“values.1473345900”:{$exists:true},{$set:{“values.1473345900”:0})
可以。Thx,Chridam!!!问题是:我不知道1473345900是否已经存在。因此1)我必须找出1473345900是否存在,2)我必须更新1473345900的值。抱歉,我没有解释…
db.sites.update({“values.1473345900”:{$exists:true},{$set:{“values.1473345900”:0})
可以。Thx,Chridam!!!