Pongongo के साथ mongodb को कैसे सॉर्ट करें


164

मैं अपने mongoDB को क्वेरी करते समय सॉर्ट सुविधा का उपयोग करने का प्रयास कर रहा हूं, लेकिन यह विफल हो रहा है। MongoDB कंसोल में समान क्वेरी काम करती है, लेकिन यहां नहीं। कोड इस प्रकार है:

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

मुझे मिलने वाली त्रुटि इस प्रकार है:

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

मुझे कहीं और एक लिंक मिला, जिसमें कहा गया है कि अगर मुझे pymongo का उपयोग करना है, तो मुझे कुंजी के 'u' को रखना होगा, लेकिन यह भी काम नहीं करेगा। किसी और को यह काम करने के लिए मिलता है या यह एक बग है।

जवाबों:


302

.sort(), pymongo में, लेता है keyऔरdirection पैरामीटर के रूप में।

इसलिए यदि आप इसके आधार पर छाँटना चाहते हैं, idतो आपको कहना चाहिए.sort("_id", 1)

कई क्षेत्रों के लिए:

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

124
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])कई क्षेत्रों को क्रमबद्ध करने के लिए।
ऋचाधर

4
अधिक विवरणों की तलाश करने वालों के लिए, यहाँ pymongo api.mongodb.org/python/current/api/pymongo/…
Shane Reustle

21
नोट: आरोही: 1, अवरोही -1
मार्टलार्क

2
किसी भी विचार क्यों वे इतनी आसान {"फ़ील्ड 1": 1, "फ़ील्ड 2": 1} जेन्सन संकेतन पर कसाई?
निको

2
@ निको - रोमुलोमडू जवाब नीचे देखें
बाजल

34

आप यह कोशिश कर सकते हैं:

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

17

यह भी काम करता है:

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

मैं अपने कोड में इसका उपयोग कर रहा हूं, कृपया टिप्पणी करें कि क्या मैं यहां कुछ गलत कर रहा हूं, धन्यवाद।


आपको उपयोग करना चाहिए: ASCENDINGऔर DESCENDINGसे pymongo। :)
Sn0pY

7

क्यों अजगर बजाय ताना की सूची का उपयोग करता है?

अजगर में आप इस बात की गारंटी नहीं दे सकते हैं कि आपके द्वारा घोषित आदेश में शब्दकोश की व्याख्या की जाएगी।

तो, मेंगो शेल में आप कर सकते हैं .sort({'field1':1,'field2':1})और दुभाषिया को पहले स्तर पर फ़ील्ड 1 और दूसरे स्तर पर फ़ील्ड 2 को सॉर्ट करना चाहिए।

यदि इस सिंटैक्स का उपयोग अजगर में किया गया था, तो पहले स्तर पर फ़ील्ड 2 को सॉर्ट करने का एक मौका है। टपल के साथ कोई जोखिम नहीं है।

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

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

अजगर कुंजी, दिशा का उपयोग करता है। आप उपरोक्त तरीके का उपयोग कर सकते हैं।

तो आपके मामले में आप ऐसा कर सकते हैं

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

0

TLDR: एकत्रीकरण पाइपलाइन पारंपरिक की तुलना में तेज है .find().sort()

अब असली स्पष्टीकरण की ओर बढ़ रहे हैं। MongoDB में सॉर्टिंग ऑपरेशन करने के दो तरीके हैं:

  1. का उपयोग कर .find()और .sort()
  2. या एकत्रीकरण पाइपलाइन का उपयोग करना।

जैसा कि कई ने सुझाया है।

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

हालांकि, एकत्रीकरण पाइपलाइन की तुलना में यह एक धीमी प्रक्रिया है।

एकत्रीकरण पाइपलाइन विधि के लिए आ रहा है। छँटाई के लिए इच्छित सरल एकत्रीकरण पाइपलाइन को लागू करने के चरण हैं:

  1. $ मैच (वैकल्पिक कदम)
  2. $ प्रकार

नोट: मेरे अनुभव में, एकत्रीकरण पाइपलाइन .find().sort()विधि की तुलना में थोड़ी तेजी से काम करती है ।

यहाँ एकत्रीकरण पाइपलाइन का एक उदाहरण है।

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

इस विधि को स्वयं आज़माएं, गति की तुलना करें और मुझे टिप्पणियों में इस बारे में बताएं।

संपादित करें: allowDiskUse=Trueकई फ़ील्ड पर सॉर्ट करते समय उपयोग करना न भूलें अन्यथा यह एक त्रुटि फेंक देगा।


0

कहते हैं, आप 'create_on' फ़ील्ड के आधार पर छाँटना चाहते हैं, तो आप इस तरह कर सकते हैं,

.sort('{}'.format('created_on'), 1 if sort_type == 'asc' else -1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.