2012-03-16 87 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

会为你工作?