Cara mengurutkan mongodb dengan pymongo


164

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.

Jawaban:


302

.sort(), dalam pymongo, take keydan directionsebagai parameter.

Jadi jika Anda ingin mengurutkan berdasarkan, katakanlah, idmaka Anda harus melakukannya.sort("_id", 1)

Untuk banyak bidang:

.sort([("field1", pymongo.ASCENDING), ("field2", pymongo.DESCENDING)])

124
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])untuk mengurutkan beberapa bidang.
richardr

4
Bagi mereka yang mencari rincian lebih lanjut, berikut adalah tautan ke dokumentasi tentang penyortiran dengan pymongo api.mongodb.org/python/current/api/pymongo/…
Shane Reustle

21
CATATAN: naik: 1, turun -1
Martlark

2
Tahu mengapa mereka memotong notasi {"field1": 1, "field2": 1} JSON yang begitu mudah?
Nico

2
@Nico - lihat jawaban romulomadu di bawah ini
Bajal

34

Anda dapat mencoba ini:

db.Account.find().sort("UserName")  
db.Account.find().sort("UserName",pymongo.ASCENDING)   
db.Account.find().sort("UserName",pymongo.DESCENDING)  

17

Ini juga berfungsi:

db.Account.find().sort('UserName', -1)
db.Account.find().sort('UserName', 1)

Saya menggunakan ini dalam kode saya, silakan komentar jika saya melakukan sesuatu yang salah di sini, terima kasih.


Anda harus menggunakan: ASCENDINGdan DESCENDINGdari pymongo. :)
Sn0pY

7

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.

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

1
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

Python menggunakan kunci, arah. Anda bisa menggunakan cara di atas.

Jadi dalam kasus Anda, Anda bisa melakukan ini

for post in db.posts.find().sort('entities.user_mentions.screen_name',pymongo.ASCENDING):
        print post

0

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:

  1. Menggunakan .find()dan .sort().
  2. Atau menggunakan pipa agregasi.

Seperti yang disarankan oleh banyak .find (). Sort () adalah cara paling sederhana untuk melakukan penyortiran.

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

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:

  1. $ match (langkah opsional)
  2. $ sort

CATATAN: Dalam pengalaman saya, pipa agregasi bekerja sedikit lebih cepat daripada .find().sort()metode ini.

Berikut adalah contoh dari pipa agregasi.

db.collection_name.aggregate([{
    "$match": {
        # your query - optional step
    }
},
{
    "$sort": {
        "field_1": pymongo.ASCENDING,
        "field_2": pymongo.DESCENDING,
        ....
    }
}])

Coba metode ini sendiri, bandingkan kecepatannya dan beri tahu saya tentang ini di komentar.

Sunting: Jangan lupa gunakan allowDiskUse=Truesaat mengurutkan pada beberapa bidang jika tidak akan menimbulkan kesalahan.


0

Katakanlah, Anda ingin mengurutkan berdasarkan bidang 'Created_on', maka Anda dapat melakukannya seperti ini,

.sort('{}'.format('created_on'), 1 if sort_type == 'asc' else -1)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.