Saya mencoba menggunakan fitur sortir ketika menanyakan mongoDB saya, tetapi gagal. Kueri yang sama berfungsi di konsol MongoDB tetapi tidak di sini. Kode adalah sebagai berikut:
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
Kesalahan yang saya dapatkan adalah sebagai berikut:
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
Saya menemukan tautan di tempat lain yang mengatakan bahwa saya harus meletakkan infront kunci jika menggunakan pymongo, tetapi itu juga tidak berhasil. Orang lain membuat ini berfungsi atau ini bug.
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])
untuk mengurutkan beberapa bidang.Anda dapat mencoba ini:
sumber
Ini juga berfungsi:
Saya menggunakan ini dalam kode saya, silakan komentar jika saya melakukan sesuatu yang salah di sini, terima kasih.
sumber
ASCENDING
danDESCENDING
daripymongo
. :)Mengapa python menggunakan daftar tuple sebagai gantinya?
Dengan python Anda tidak dapat menjamin bahwa kamus akan ditafsirkan sesuai urutan yang Anda nyatakan.
Jadi, dalam mongo shell yang bisa Anda lakukan
.sort({'field1':1,'field2':1})
dan penerjemah harus mengurutkan field1 di tingkat pertama dan bidang 2 di tingkat kedua.Jika sintax ini digunakan dalam python, ada kemungkinan untuk mengurutkan field2 di tingkat pertama. Dengan tuple tidak ada risiko.
sumber
Python menggunakan kunci, arah. Anda bisa menggunakan cara di atas.
Jadi dalam kasus Anda, Anda bisa melakukan ini
sumber
TLDR: Pipa agregat lebih cepat dibandingkan dengan konvensional
.find().sort()
.Sekarang pindah ke penjelasan yang sebenarnya. Ada dua cara untuk melakukan operasi penyortiran di MongoDB:
.find()
dan.sort()
.Seperti yang disarankan oleh banyak .find (). Sort () adalah cara paling sederhana untuk melakukan penyortiran.
Namun, ini adalah proses yang lambat dibandingkan dengan pipa agregasi.
Datang ke metode pipa agregasi. Langkah-langkah untuk menerapkan pipa agregasi sederhana yang dimaksudkan untuk menyortir adalah:
CATATAN: Dalam pengalaman saya, pipa agregasi bekerja sedikit lebih cepat daripada
.find().sort()
metode ini.Berikut adalah contoh dari pipa agregasi.
Coba metode ini sendiri, bandingkan kecepatannya dan beri tahu saya tentang ini di komentar.
Sunting: Jangan lupa gunakan
allowDiskUse=True
saat mengurutkan pada beberapa bidang jika tidak akan menimbulkan kesalahan.sumber
Katakanlah, Anda ingin mengurutkan berdasarkan bidang 'Created_on', maka Anda dapat melakukannya seperti ini,
sumber