2012-03-16 4 views
4

J'ai un tel document dans MongoDB:Comment supprimer les premiers éléments n de mongodb array?

{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 

Mise à jour Ceci est impossible au moment

Répondre

4

Je pense que vous pouvez le faire comme ceci:

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

Cette remplacerait effectivement tout l'enregistrement par les nouvelles données, vous devrez donc être prudent. Vous auriez besoin de connaître la longueur du tableau outbox pour obtenir les chiffres corrects. C'est-à-dire que l'option $ slice sautera 2 enregistrements et retournera les deux enregistrements suivants dans ce cas. Il ne semble pas y avoir moyen d'en sauter deux et de retourner ensuite les éléments restants. La première partie, {uid: 1212} limite l'opération à ce document unique, et la seconde partie renvoie le nœud mais avec un sous-ensemble de ces éléments de tableau et est utilisée comme données pour la mise à jour.

Plus d'info sur tranche de $ ici: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

Est-ce que ce travail pour vous?

Questions connexes