MongoDB:在多个键上执行$ inc

时间:2012-05-13 10:04:53

标签: mongodb mongodb-php

我需要帮助增加参与者中所有键的值,而不必知道其中键的名称。

> db.conversations.findOne()

{
"_id" : ObjectId("4faf74b238ba278704000000"),
"participants" : {
    "4f81eab338ba27c011000001" : NumberLong(2),
    "4f78497938ba27bf11000002" : NumberLong(2)
}
}

我尝试过像

这样的事情
$mongodb->conversations->update(array('_id' => new \MongoId($objectId)), array('$inc' => array('participants' => 1)));

无济于事......

2 个答案:

答案 0 :(得分:2)

您需要重新设计架构。拥有“随机密钥名称”绝不是一个好主意。即使MongoDB是无模式的,它仍然意味着您需要定义键名。您应该将架构更改为:

{
    "_id" : ObjectId("4faf74b238ba278704000000"),
    "participants" : [
        { _id: "4f81eab338ba27c011000001", count: NumberLong(2) },
        { _id: "4f78497938ba27bf11000002", count: NumberLong(2) }
    ]
}

可悲的是,即使这样,您也无法在一个命令中更新所有嵌入计数。目前有一项开放式功能请求:https://jira.mongodb.org/browse/SERVER-1243

为了仍然更新所有内容,您应该:

  • 查询文档
  • 更新客户端的所有计数
  • 再次存储文件

为了防止这种情况发生,请查看"Compare and Swap"及以下段落。

答案 1 :(得分:0)

在当前版本的MongoDB中,无法在一次移动中更新所有嵌套元素。所以我可以建议使用“foreach {}”。

阅读已编辑的主题:How to Update Multiple Array Elements in mongodb

我希望这个功能将在下一个版本中实现。