2011-06-06 97 views
1

我需要使用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=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 
} 

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

+0

似乎它只会更新一个subdoc作为多个指根文件....嗯 – sunebrodersen 2011-06-06 09:48:03

回答

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.以其他方式重新组织您的文档结构,以避免多个级别数组嵌套。

+0

感谢您的答案。我宁愿避免额外的阅读,所以我改变了布局一点,所以类别现在是一个对象而不是数组 - 请参阅原始文章中的编辑。 – sunebrodersen 2011-06-06 11:13:53

+0

@sunebrodersen:不客气。很好,它会工作。 – 2011-06-06 11:35:08