2016-03-04 69 views
3

我有db like;在mongodb中的特定值之後插入數組項目

{"_id" : 1 , children: ["2", "123", "5"]} 

我想插入一個元素到子數組中。當你知道索引時很容易。 $ position可用於此目的。喜歡;

db.module_menu.update({"_id" : "1"} , 
         {$push : {"children" : { 
            $each : ["12"] , $position : 1}}}); 

但讓我說我不知道​​位置索引,我知道我想插入的元素的值。

我有value: 12和我想要插入的值。 insertAfter: 2

因此它應該是;

{"_id" : 1, text: "" , children: ["2","12", "123", "5"]} 

我該怎麼辦?

通過children數組中的每個元素查找值的索引,並使用$ position插入值。這是唯一的方法嗎?

+0

您可以嘗試$ addToSet –

+0

$ addToSet可能無法保持數組排序 –

+0

$ addToSet就像$推?它增加了集合的結尾。我錯了嗎? –

回答

1

恐怕這是不可能的。有一個古老的問題使用$function in update,但你唯一的方法是讀取,修改和保持陣列。

另一方面,如果你是一個嵌入式文檔的數組,那麼你可以使用$ positional operator$可用於$set您的簡單數組中的值,但可以用於$push

> db.test.find() 
{ "_id" : ObjectId("56d9570d09e01f20e254d0f3"), "a" : [ 1, 2, 3 ] } 
> db.test.update({"_id": ObjectId("56d9570d09e01f20e254d0f3"), "a": 2}, 
       {$push: {a: {$each: [2], $position: "$"}}}) 
WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 2, 
     "errmsg" : "The value for $position must be a positive numeric value not a String" 
    } 
}) 
0

沒有函數來獲取位置和更新一氣呵成, 所以你的問題,你需要更新之前得到的位置,並通過它來查詢 - 所以這意味着我們是在1操作:1巴西斯。

另一種方法是檢索數據 - 執行就地更新,推動全陣列設置回蒙戈