2012-03-16 4 views
4

У меня есть такой документ в MongoDB:Как удалить первые n элементов из массива 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 

Update Это невозможно в данный момент

ответ

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

Будет ли эта работа для вас?

Смежные вопросы