2012-05-05 52 views
8

我的文檔喜歡更新嵌入對象MongoDB中

{ 
    id : 100, 
    heros:[ 
     { 
      nickname : "test", 
      spells : [ 
      {spell_id : 61, level : 1}, 
      {spell_id : 1, level : 2} 
      ] 
     } 
    ] 
} 

我不能$set法術level : 3spell_id : 1spells裏面heros與綽號「測試中,我嘗試此查詢:

db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, 
{$set:{"heros.spells.$.level":3}}); 

Errror我看到的是

無法追加到使用字符串字段名稱的數組[法術] 感謝您的幫助。

回答

9

您只能使用位置運算符$用於單級陣列。在你的情況下,你有一個嵌套數組(heros是一個數組,並在其中每個英雄有一個spells陣列)。

> db.test.update({"heros.nickname":"test", "heros.spells.spell_id":1}, {$set:{"heros.0.spells.1.level":3}}); 
+0

是的,我喜歡你說 –

+0

謝謝dcrosta! –

1

嘗試這樣:

db.test.find({"heros.nickname":"test"}).forEach(function(x) { 
    bool match = false; 
    for (i=0 ; i< x.heros[0].spells.length ; i++) { 
     if (x.heros[0].spells[i].spell_id == 1) 
     { 
      x.heros[0].spells[i].level = 3; 
      match = true; 
     } 
    } 
    if (match === true) db.test.update({ id: x.id }, x); 
}); 

顯然有人開了票加放一個功能更新子句中的能力,但它尚未解決:https://jira.mongodb.org/browse/SERVER-458

+0

您的代碼不工作:

如果你知道數組的索引,你可以做一個更新時,喜歡用明確的指標。我認爲在X將所有文件不是嗎? –

+0

@DenisErmolin哎呀...是的,那是錯的。我又拍了一張(見更新)。 ** x **是文檔,對,所以我想你應該可以通過** id **屬性來更新它。 – McGarnagle

+0

x.spells引用法術,但在英雄陣列法術 –