2011-06-06 63 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