Php 在mongoDB中更新多个嵌入式文档

Php 在mongoDB中更新多个嵌入式文档,php,mongodb,Php,Mongodb,我需要使用PHP更新mongo中的多个嵌入式文档。我的布局如下所示: { _id: id, visits : { visitID: 12 categories: [{ catagory_id: 1, name: somename, count: 11, duration: 122 }, {

我需要使用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
              }]
   }
}
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感谢您的回答。我更愿意避免额外的阅读,所以我改变了布局,使类别现在是一个对象而不是数组-请参阅原始帖子中的编辑。谢谢你的回答。我更愿意避免额外的阅读,所以我改变了布局,使类别现在成为一个对象而不是数组-请参阅原始帖子中的编辑。