2012-03-16 88 views
4

我在MongoDB中有這樣的文件:如何從mongodb數組中刪除前n個元素?

{uid:1212, outbox: 
[ 
    {msg1}, 
    {msg2}, 
    {msg3}, 
    ... 
    {msgN} 
] 
} 
 
I want atomically remove first n elements from array outbox. 

I know two ways to remove element from array 
1) $pop 
    But it removes only one element 
2) {$unset:{outbox.0:1}} after {$pull:{outbox:null}} 
    But it non atomic and removes only one element 

更新 這是不可能的,此刻

回答

4

我認爲你可以做這樣的:

db.data.update(
    {uid:1212}, 
    db.data.findOne({uid:1212}, {outbox: {$slice: [2,2]}, uid: 1, _id: 0 }) 
); 

這將有效地用新數據替換整個記錄,所以你需要小心一點。您需要知道發件箱數組的長度才能獲得正確的數字。也就是說,$ slice選項將跳過2條記錄,然後在這種情況下返回下兩條記錄。似乎沒有辦法跳過兩個,然後返回剩餘的項目。

第一部分,{UID:1212}限制了操作上單個文件,並且所述第二部分返回節點但這些陣列元素的子集,並且被用作用於更新的數據。在$切片這裏

更多信息:http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

會爲你工作?