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

时间:2012-03-16 07:01:18

标签: mongodb

我在mongodb中有这样的文件:

{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

更新 目前这是不可能的

1 个答案:

答案 0 :(得分:5)

我认为你可以这样做:

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

这将有效地用新数据替换整个记录,因此您需要对它有点小心。您需要知道发件箱数组的长度才能获得正确的数字。也就是说,$ slice选项将跳过2条记录,然后在这种情况下返回接下来的两条记录。似乎没有办法跳过两个然后返回剩余的项目。

第一部分{uid:1212}将操作限制为该单个文档,第二部分返回节点但具有这些数组元素的子集,并用作更新的数据。

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

这会对你有用吗?