1

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

> 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)));

无济于事...

4

2 回答 2

2

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

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

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

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

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

为了防止出现这种情况,请查看“比较和交换”和以下段落。

于 2012-05-13T10:40:17.810 回答
0

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

阅读相关主题:如何在 mongodb 中更新多个数组元素

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

于 2012-05-13T17:50:52.650 回答