2011-12-08 83 views
0

我有一個複雜的mongodoc有代表在庫存項目數嵌入文檔工作直接嵌入文檔工作。整個文檔可以被認爲是一個完整的清單。關鍵的「部分」包含另外一個關鍵的「項目」,其中包含單個項目及其數據,如價格,描述等。每個項目還有一個GUID,因此可以單獨查找。MongoDB中

我寫了一個存儲功能,以獵取通過ID個別項目,看起來像這樣:

function (item_id) { 
    var pls = db.pricelists.findOne({'sections.items.item_id':item_id}); 
    if (!pls) { 
     return null; 
    } 
    for (var sect in pls.sections) { 
     for (var item in pls.sections[sect].items) { 
      if (pls.sections[sect].items[item].item_id == item_id) { 
       return pls.sections[sect].items[item]; 
      } 
     } 
    } 
} 

一切工作找到爲止。問題是當我想修改這個嵌入式文檔並將其保存在其父文檔中時。從外殼給出的示例:

var item = db.eval('find_item(1)'); 
item.users_who_bought = [11,16]; 
item; 

這將打印回控制檯正確的項目。

{ 
    "name" : "item00", 
    "order" : 0, 
    "item_id" : 1, 
    "hidden" : false, 
    "variants" : [ 
     { 
      "price" : "0.56", 
      "label" : "variant000" 
     }, 
     { 
      "price" : "1.56", 
      "label" : "variant001" 
     }, 
     { 
      "price" : "2.56", 
      "label" : "variant002" 
     } 
    ], 
    "desc" : "Sociis habitasse, integer pellentesque sit! Nisi purus tincidunt amet mus scelerisque amet, pid enim eros phasellus dolor sociis nunc dictumst sed nunc, integer hac!", 
     "users_who_bought" : [11,16] 

} 

我很茫然,因爲如何制定查詢以將此嵌入式項目文檔更新回其父文檔。我已經試過這樣的事情(在ITEM_ID被硬編碼爲一個在這裏爲例):

db.pricelists.update({'sections.item.item_id': 1}, {$set: {'sections.item.item_id[1]': item}}) 

但是,這並不正常工作,並嘗試添加到項目陣列。

有沒有辦法來修改嵌入文檔批發通到這樣的更新語句,通過有選擇地在文檔內的值?或者我想這是錯誤的方式,我需要編寫另一個存儲的迭代器函數,它會再次找到該項目,然後使用深度嵌入的新值更新整個父文檔?謝謝!

回答

1

如果你想修改數組內的項目,我建議使用條件$拉第一和$推動更新的項目即可。

在你的情況下,它會隨着你有段陣列一點點地仍然是複雜的。因此,您可能需要使用$運算符,然後在items數組上使用$ pull/$ push。

0

如果我理解正確,你的目的是訪問,並在特定位置陣列修改值。如果是這樣的話,你可以稍微修改查詢:

db.pricelists.update(
    {'sections.item.item_id': 1}, 
    {$set: {'sections.item.item_id.$': item}} 
) 

在你不需要使用[1],$指.update()方法的第一個參數指定的第一場比賽換句話說。欲瞭解更多詳情,請參見位置運營商:http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

+0

您正確的理解,它只是在數組中元素本身的文件也是如此。此語句返回'不能使用字符串字段名稱[項目]'追加到數組。我認爲這是因爲部分和項目都是數組。我嘗試過使用兩個位置運算符,一個位於後面的部分和一個後面的位置,但返回相同的錯誤。 – DeaconDesperado

+0

hm ...如果你有這樣的話{sections:[[1,2],[3,4],[5,6]]}我認爲唯一的方法是使用forEach()並在數組內進行額外的掃描。雖然也許有一個更好的解決方案,我不知道。 – ioseb