limite de() et de tri() afin pymongo et mongodb
Malgré la lecture des peuples des réponses indiquant que le tri est effectué tout d'abord, la preuve montre quelque chose de différent que la limite est fait avant le tri. Est-il un moyen de force sort toujours en premier?
views = mongo.db.view_logging.find().sort([('count', 1)]).limit(10)
Si je utiliser .sort().limit()
ou .limit().sort()
, la limite est prioritaire. Je me demande si c'est quelque chose à voir avec pymongo
...
- Quels sont vos PyMongo et MongoDB versions?
- Pouvez-vous repo sur une petite dataset
{_id:1}, {_id:2}
etc. et nous donner votre code et les sorties?
Vous devez vous connecter pour publier un commentaire.
Selon la la documentation, indépendamment de ce qui se passe d'abord dans votre chaîne de commandes,
sort()
serait toujours appliquée avant lalimit()
.Vous pouvez également étudier l'
.expliquer()
résultats de votre requête et de regarder les phases d'exécution, vous constaterez que le tri étape d'entrée examine l'ensemble des filtrée (dans votre cas, tous les documents de la collection), puis la limite est appliquée.Allons par le biais d'un exemple.
Imaginer qu'il y est un
foo
base de données avec untest
collection ayant 6 documents:Maintenant, nous allons exécuter des requêtes avec différents afin de
sort()
etlimit()
et de vérifier les résultats et le plan d'expliquer.De tri et de limiter l':
Limiter et trier ensuite:
Comme vous pouvez le voir, dans les deux cas, le tri est appliqué en premier, et affecte tous les 6 documents, puis la limite de limiter les résultats aux 3.
Et, le les plans d'exécution sont exactement les mêmes:
Voir aussi:
Je soupçonne que vous êtes en passant mauvaise clé dans le tri paramètre. quelque chose comme "$key_name" au lieu de "key_name"
reportez-vous Comment dites-vous Mongo pour trier une collection avant de restreindre les résultats?la solution du même problème que le vôtre
Logiquement, il devrait être tout ce qui vient en premier dans le pipeline, Mais MongoDB toujours en premier avant la limite.
Dans mon test de l'opération de Tri ne l'emporte peu importe si elle est à venir avant de sauter ou après. Cependant, il semble être un comportement très étrange pour moi.
Mon échantillon de données est:
Python code de test:
Résultat:
sort
est toujours prioritaires.Mongodb documentation indique que la
skip()
méthode de contrôle le point de départ de l'ensemble de résultats, suivie parsort()
et se termine avec lalimit()
méthode.C'est quel que soit l'ordre de votre code. La raison en est que mongo obtient toutes les méthodes de la requête, puis il donne l'ordre de le skip-tri-limite de méthodes dans l'ordre exact, puis exécute la requête.
La accepté de répondre ne fonctionne pas pour moi, mais ce n':
avec la limite à l'extérieur et le tri à l'intérieur de l'argument.