我需要帮助增加参与者中所有键的值,而不必知道其中键的名称。
> 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)));
无济于事......
答案 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
我希望这个功能将在下一个版本中实现。