Php 在mongoDB中更新多个嵌入式文档
我需要使用PHP更新mongo中的多个嵌入式文档。我的布局如下所示:Php 在mongoDB中更新多个嵌入式文档,php,mongodb,Php,Mongodb,我需要使用PHP更新mongo中的多个嵌入式文档。我的布局如下所示: { _id: id, visits : { visitID: 12 categories: [{ catagory_id: 1, name: somename, count: 11, duration: 122 }, {
{
_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
}]
}
}
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)
);
}
文档也可以有多个访问
现在我想更新两个类别,一个是id=1
和name=somename
,另一个是id=1
和name=some\u new\u name
。两者都应将“计数”加1,将“持续时间”加45
第一个文档存在,但第二个文档不存在
我想有一个这样的功能:
{
_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
}]
}
}
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)
);
}
但是有了这个,我需要为我将要更新的每个类别调用函数。有没有办法在一个电话里做到这一点
编辑:
稍微改变了布局,将“类别”作为对象而不是数组。然后使用“类别id”和“类别名称”的组合作为属性名称。比如:
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目前不支持阵列多级深度更新() 因此,以下代码将不起作用:
'$inc' => array(
'visits.categories.$.count' => 1,
'visits.categories.$.duration' => 123,
),
因此,有一些解决方案:
1.加载文档=>更新=>保存(可能的并发问题)2.按如下方式重新组织文档结构(并使用一个位置运算符进行更新): 3.等待多个位置运算符支持(在mongodb的2.1版本中规划)。
4.以其他方式重新组织文档结构,以避免多层数组嵌套。Mongodb目前不支持数组多层深度更新() 因此,以下代码将不起作用:
'$inc' => array(
'visits.categories.$.count' => 1,
'visits.categories.$.duration' => 123,
),
因此,有一些解决方案:
1.加载文档=>更新=>保存(可能的并发问题)2.按如下方式重新组织文档结构(并使用一个位置运算符进行更新): 3.等待多个位置运算符支持(在mongodb的2.1版本中规划)。
4.以其他方式重新组织文档结构,以避免多层数组嵌套。似乎只会更新一个子文档,因为多个子文档引用了根文档….hmm似乎只会更新一个子文档,因为多个子文档引用了根文档….hmm感谢您的回答。我更愿意避免额外的阅读,所以我改变了布局,使类别现在是一个对象而不是数组-请参阅原始帖子中的编辑。谢谢你的回答。我更愿意避免额外的阅读,所以我改变了布局,使类别现在成为一个对象而不是数组-请参阅原始帖子中的编辑。