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

时间:2011-06-06 09:11:44

标签: php mongodb

我需要使用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=1name=somename,另一个包含id=1name=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
}

我可以一次更新几个“对象”..

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.重新组织你的文档结构,以避免多级数组嵌套。