如何从MongoDB数组中删除前n个元素?

5

我在mongodb中有这样的文档:

{uid:1212, outbox:
 [
   {msg1},
   {msg2},
   {msg3},
   ...
   {msgN}
 ]
}

我希望能原子地从数组outbox中移除前n个元素。
我知道两种从数组中移除元素的方法: 1)$pop 但它只能移除一个元素 2){$unset:{outbox.0:1}} 在{$pull:{outbox:null}}之后 但它不是原子操作,而且只能移除一个元素 更新 目前这是不可能实现的。
1个回答

5
我认为你可以这样做:
db.data.update(
   {uid:1212}, 
   db.data.findOne({uid:1212}, {outbox: {$slice: [2,2]}, uid: 1, _id: 0 })
);

这将有效地用新数据替换整个记录,因此您需要对其进行小心处理。您需要知道outbox数组的长度以获得正确的数字。也就是说,在这种情况下,$slice选项将跳过2个记录,然后返回接下来的两个记录。似乎没有办法跳过两个记录然后返回剩余的项目。
第一部分{uid:1212}将操作限制为单个文档,第二部分返回节点,但其中只包含该数组元素的子集,并用作更新的数据。
有关$slice的更多信息,请参见此处:http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements
这样可以吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接