更新mongoDB中的多个嵌入式文档
我需要使用PHP更新mongo中的多个嵌入式文档。我的布局看起来像这样:更新mongoDB中的多个嵌入式文档
{
_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
}
我可以更新几个 “对象” 在一次东西..
的MongoDB目前不支持阵列多层次深更新(jira)
所以下面的代码将不起作用:
'$inc' => array(
'visits.categories.$.count' => 1,
'visits.categories.$.duration' => 123,
),
所以有一些解决这个解决方案:
1.Load文件=>更新=>保存(使用一个位置操作和更新)(可能并发问题)
2.Reorganize您的文档结构是这样的:
{
_id: id,
visits : [{
visitID: 12
}],
categories: [{
catagory_id: 1,
name: somename,
count: 11,
duration: 122,
visitID: 12
}]
}
}
3.Wait支持多位置运算符(在2.1版本的mongodb中进行规划)。
4.以其他方式重新组织您的文档结构,以避免多个级别数组嵌套。
感谢您的答案。我宁愿避免额外的阅读,所以我改变了布局一点,所以类别现在是一个对象而不是数组 - 请参阅原始文章中的编辑。 – sunebrodersen 2011-06-06 11:13:53
@sunebrodersen:不客气。很好,它会工作。 – 2011-06-06 11:35:08
似乎它只会更新一个subdoc作为多个指根文件....嗯 – sunebrodersen 2011-06-06 09:48:03