Ich versuche, die Sortierfunktion zu verwenden, wenn ich meine mongoDB abfrage, aber sie schlägt fehl. Die gleiche Abfrage funktioniert in der MongoDB-Konsole, jedoch nicht hier. Der Code lautet wie folgt:
import pymongo
from pymongo import Connection
connection = Connection()
db = connection.myDB
print db.posts.count()
for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({u'entities.user_mentions.screen_name':1}):
print post
Der Fehler, den ich bekomme, ist wie folgt:
Traceback (most recent call last):
File "find_ow.py", line 7, in <module>
for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({'entities.user_mentions.screen_name':1},1):
File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/cursor.py", line 430, in sort
File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/helpers.py", line 67, in _index_document
TypeError: first item in each key pair must be a string
Ich habe an anderer Stelle einen Link gefunden, der besagt, dass ich bei Verwendung von Pymongo ein 'u' vor den Schlüssel setzen muss, aber das hat auch nicht funktioniert. Jeder andere bringt das zum Laufen oder ist das ein Fehler?
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])
um mehrere Felder zu sortieren.Sie können dies versuchen:
quelle
Das funktioniert auch:
Ich verwende dies in meinem Code. Bitte kommentieren Sie, wenn ich hier etwas falsch mache. Danke.
quelle
ASCENDING
undDESCENDING
vonpymongo
. :)Warum verwendet Python stattdessen eine Liste von Tupeln?
In Python können Sie nicht garantieren, dass das Wörterbuch in der von Ihnen angegebenen Reihenfolge interpretiert wird.
In der Mongo-Shell könnten Sie dies tun,
.sort({'field1':1,'field2':1})
und der Interpreter sollte Feld 1 auf der ersten Ebene und Feld 2 auf der zweiten Ebene sortieren.Wenn diese Sintax in Python verwendet wurde, besteht die Möglichkeit, Feld2 auf der ersten Ebene zu sortieren. Mit Tupel besteht kein Risiko.
quelle
Python verwendet Schlüssel, Richtung. Sie können den obigen Weg verwenden.
In Ihrem Fall können Sie dies also tun
quelle
TLDR: Die Aggregationspipeline ist im Vergleich zu herkömmlichen Pipelines schneller
.find().sort()
.Kommen wir nun zur eigentlichen Erklärung. Es gibt zwei Möglichkeiten, Sortiervorgänge in MongoDB auszuführen:
.find()
und.sort()
.Wie von vielen vorgeschlagen .Find (). Sort () ist der einfachste Weg, um die Sortierung durchzuführen.
Dies ist jedoch im Vergleich zur Aggregationspipeline ein langsamer Prozess.
Kommen wir zur Aggregationspipeline-Methode. Die Schritte zum Implementieren einer einfachen Aggregationspipeline zum Sortieren sind:
HINWEIS: Nach meiner Erfahrung arbeitet die Aggregationspipeline etwas schneller als die
.find().sort()
Methode.Hier ist ein Beispiel für die Aggregationspipeline.
Probieren Sie diese Methode selbst aus, vergleichen Sie die Geschwindigkeit und teilen Sie mir dies in den Kommentaren mit.
Bearbeiten: Vergessen Sie nicht,
allowDiskUse=True
beim Sortieren nach mehreren Feldern zu verwenden, da sonst ein Fehler auftritt.quelle
Angenommen, Sie möchten nach dem Feld 'created_on' sortieren, dann können Sie dies folgendermaßen tun:
quelle