2013-09-28 8 views
25

Dans mes collections, les documents contiennent l'état de type clé et l'horodatage. Quand je veux trouver dix derniers documents puis-je écrire requête suivanteComment supprimer N nombres de documents dans mongodb

db.collectionsname.find().sort({"timestamp"-1}).limit(10) 

Cette requête me donne des résultats que je veux, mais quand je veux supprimer dix derniers documents je rédigeais la requête suivante

db.collectionsname.remove({"status":0},10).sort({"timestamp":-1}) 

mais il montre l'erreur suivante TypeError: Cannot call method 'sort' of undefined et encore j'ai écrit la même requête que ci-dessous db.collectionsname.remove({"status":0},10) Il supprime un seul document. Alors, comment puis-je écrire une requête qui supprime dix documents les plus récents et trie sur timestamp?

+1

Cela pourrait vous aider à http://docs.mongodb.org/manual/reference/command/findAndModify/ – Mina

Répondre

51

Vous ne pouvez pas définir de limite lorsque vous utilisez remove ou findAndModify. Donc, si vous voulez limiter précisément le nombre de documents supprimés, vous devrez le faire en deux étapes.

db.collectionName.find({}, {_id : 1}) 
    .limit(100) 
    .sort({timestamp:-1}) 
    .toArray() 
    .map(function(doc) { return doc._id; }); // Pull out just the _ids 

passent ensuite les retournés _id s à la méthode de suppression:

db.collectionName.remove({_id: {$in: removeIdsArray}}) 

Pour votre information: vous ne pouvez pas supprimer des documents d'une collection limitée.

+0

Qui pensez-vous avoir à faire la partie de tri si tous les enregistrements vont être supprimés? – ULazdins

+2

Corrigez-moi si je me trompe, mais cela fait une différence si 'limit (100)' vient avant 'sort ({timestamp: -1})' ou après. Dans l'exemple, @WiredPrairie limite les résultats à 100 et les trie ensuite ('.sort ({timestamp: -1}). Limit (100)'). Dans ce cas, l'instruction de tri n'a aucun effet sur les enregistrements renvoyés. D'un autre côté, si vous écrivez '.limit (100) .sort ({timestamp: -1})', cela ferait une différence. – ULazdins

+10

@ULazdins "Mongo applique le tri avant de limiter les résultats quel que soit l'ordre que vous appelez trier et limiter sur le curseur." ([source] (http://stackoverflow.com/a/17509131/99777)) – joeytwiddle

-4

Ci-dessous requête trouver et supprimer les 10 derniers documents de la collection: -

db.collectionsname.findAndModify({ 
    query: { 'status':0 }, 
    sort: { 'timestamp': -1 }, 
    limit: 10, 
    remove: true 
}); 
+4

https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/ This doesn ne supporte pas un champ "limite", et en fait si vous l'essayez, vous constaterez qu'il supprime seulement 1 élément (comme c'est la logique par défaut) – tweak2

Questions connexes