我需要使用PHP更新mongo中的多个嵌入式文档。我的布局如下:
{
_id: id,
visits : {
visitID: 12
categories: [{
catagory_id: 1,
name: somename,
count: 11,
duration: 122
},
{
catagory_id: 1,
name: some other name,
count: 11,
duration: 122
},
{
catagory_id: 2,
name: yet another name,
count: 11,
duration: 122
}]
}
}
该文件也可以有多次访问。
现在,我想更新2个类别,一个包含id=1
和name=somename
,另一个包含id=1
和name=some_new_name
。它们都应该被“计数”1和“持续时间”45。
第一个文件存在,但第二个没有。
我想要有这样的功能:
function updateCategory($id, $visitID,$category_name,$category_id) {
$this->profiles->update(
array(
'_id' => $id,
'visits.visitID' => $visitID,
'visits.categories.name' => $category_name,
'visits.categories.id' => $category_id,
),
array(
'$inc' => array(
'visits.categories.$.count' => 1,
'visits.categories.$.duration' =>45,
),
),
array("upsert" => true)
);
}
但是我需要为每个类别调用函数,我将更新。有没有办法在一次通话中这样做?
编辑:
稍微改变了布局,使“类别”成为对象而不是数组。然后使用“category_id”和“category_name”的组合作为属性名称。像:
categories: {
1_somename : {
count: 11,
duration: 122
},
1_some other name : {
count: 11,
duration: 122
},
2_yet another name : {
count: 11,
duration: 122
},
}
然后使用upsert和
之类的东西$inc: {
"visits.$.categories.1_somename.d": 100,
"visits.$.categories.2_yet another name.c": 1
}
我可以一次更新几个“对象”..
答案 0 :(得分:1)
Mongodb目前不支持多级深层更新(jira)
所以下面的代码不起作用:
'$inc' => array(
'visits.categories.$.count' => 1,
'visits.categories.$.duration' => 123,
),
所以有一些解决方案:
1.Load document => update =>保存(可能的并发问题)
2.重新整理这样的文档结构(并使用一个位置运算符进行更新):
{
_id: id,
visits : [{
visitID: 12
}],
categories: [{
catagory_id: 1,
name: somename,
count: 11,
duration: 122,
visitID: 12
}]
}
}
3.等待多位置操作员支持(计划在2.1版本的mongodb中) 4.重新组织你的文档结构,以避免多级数组嵌套。