我有一個複雜的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}})
但是,這並不正常工作,並嘗試添加到項目陣列。
有沒有辦法來修改嵌入文檔批發通到這樣的更新語句,通過有選擇地在文檔內的值?或者我想這是錯誤的方式,我需要編寫另一個存儲的迭代器函數,它會再次找到該項目,然後使用深度嵌入的新值更新整個父文檔?謝謝!
您正確的理解,它只是在數組中元素本身的文件也是如此。此語句返回'不能使用字符串字段名稱[項目]'追加到數組。我認爲這是因爲部分和項目都是數組。我嘗試過使用兩個位置運算符,一個位於後面的部分和一個後面的位置,但返回相同的錯誤。 – DeaconDesperado
hm ...如果你有這樣的話{sections:[[1,2],[3,4],[5,6]]}我認爲唯一的方法是使用forEach()並在數組內進行額外的掃描。雖然也許有一個更好的解決方案,我不知道。 – ioseb