2015-03-10 10 views
21

मैं एक क्षेत्र में सभी वस्तुओं के लिए पूछताछ करने के लिए pymongo का उपयोग कर रहा हूँ (वास्तव में यह एक मानचित्र पर एक क्षेत्र में सभी स्थानों के लिए पूछताछ है)। मैंने गोलाकार क्षेत्र में खोजने के लिए db.command(SON()) का उपयोग किया, जो मुझे एक शब्दकोश वापस कर सकता है और शब्दकोश में results नामक एक कुंजी है जिसमें स्थान शामिल हैं। अब मुझे एक वर्ग क्षेत्र में खोज करने की आवश्यकता है और मुझे db.places.find का उपयोग करने का सुझाव दिया गया है, हालांकि, यह मुझे pymongo.cursor.Cursor कक्षा देता है और मुझे नहीं पता कि इससे स्थल के परिणाम कैसे निकालें।एक pymongo.cursor.Cursor एक कन्वर्ट में परिवर्तित करने के लिए कैसे?

क्या किसी को पता है कि मुझे कर्सर को एक कण में परिवर्तित करना चाहिए और परिणामों को निकालना चाहिए, या वर्ग क्षेत्र में वस्तुओं के लिए क्वेरी करने के लिए किसी अन्य विधि का उपयोग करना चाहिए? Btw, डाटाबेस pymongo.database.Database वर्ग

है कोड हैं:

>>> import pymongo 
>>> db = pymongo.MongoClient(host).PSRC 
>>> resp = db.places.find({"loc": {"$within": {"$box": [[ll_lng,ll_lat], [ur_lng,ur_lat]]}}}) 
>>> for doc in resp: 
>>>  print(doc) 

मैं ll_lng, ll_lat, ur_lng और ur_lat के मूल्यों है, इन मानों का उपयोग, लेकिन यह इस कोड से कुछ भी नहीं प्रिंट

+1

आप pymongo कर्सर है कि एक ही तरीका है कि आप शब्दकोशों की एक सूची का इलाज होता दिया जाता है इलाज कर सकते हैं। – dursk

+2

@ डर्स्क लेकिन कर्सर नष्ट होने से पहले आप केवल कर्सर के माध्यम से चक्र कर सकते हैं, इसलिए आपको प्रत्येक परिणाम को डिक्ट्स की सूची में सहेजना सुनिश्चित करना होगा। – Rohmer

उत्तर

29

find विधि एक रिटर्न एक Cursor उदाहरण है, जो आप सभी मिलान दस्तावेजों से अधिक चीज़ों को दोहरा सकते देता है।

दिए गए मानदंडों से मेल खाने वाले पहले दस्तावेज़ को प्राप्त करने के लिए आपको find_one का उपयोग करने की आवश्यकता है। find_one का परिणाम एक शब्दकोश है।

तुम हमेशा list निर्माता का उपयोग संग्रह में सभी दस्तावेजों की एक सूची प्रदान लेकिन ध्यान में रखना है कि इस स्मृति में सभी डेटा लोड हो जाएगा और नहीं हो सकता है कि आप क्या चाहते कर सकते हैं।

आपको लगता है कि उपयोग करने के लिए नहीं एक अच्छे कारण के लिए यदि आप कर्सर पुन: उपयोग करने की जरूरत है और है क्या करना चाहिए rewind()


डेमो find का उपयोग कर:

>>> import pymongo 
>>> conn = pymongo.MongoClient() 
>>> db = conn.test #test is my database 
>>> col = db.spam #Here spam is my collection 
>>> cur = col.find() 
>>> cur 
<pymongo.cursor.Cursor object at 0xb6d447ec> 
>>> for doc in cur: 
...  print(doc) # or do something with the document 
... 
{'a': 1, '_id': ObjectId('54ff30faadd8f30feb90268f'), 'b': 2} 
{'a': 1, 'c': 3, '_id': ObjectId('54ff32a2add8f30feb902690'), 'b': 2} 

डेमो का उपयोग कर find_one:

>>> col.find_one() 
{'a': 1, '_id': ObjectId('54ff30faadd8f30feb90268f'), 'b': 2} 
1

मोंगोडीबी find विधि एक परिणाम नहीं लौटाती है, लेकिन Cursor के रूप में परिणामों की एक सूची। यह बाद वाला एक इटरेटर है, इसलिए आप इसे for लूप के साथ जा सकते हैं।

अपने मामले के लिए, find के बजाय findOne विधि का उपयोग करें। यह आपको एक शब्दकोश के रूप में एक ही दस्तावेज़ लौटाएगा।

+0

मैं स्पष्ट रूप से समझने की कोशिश कर रहा हूं कि 'ढूंढें() 'और' find_one()' परिणाम किस तरह दिखते हैं, इसलिए स्पष्ट करने के लिए, यह एक निश्चित उत्तर है कि: 'कर्सर' 'dicts' की 'सूची' है जो डेटाबेस से मेल खाने वाले दस्तावेजों की एक सूची का प्रतिनिधित्व करता है? उदाहरण: 'कर्सर = [{"_id": ऑब्जेक्टआईडी ("xxxx"), "टोकन": ["पायथन", "प्रोग्रामिंग"], "क्षेत्र": "प्रोग्रामिंग", "शीर्षक": "पायथन"}, { "_id": ऑब्जेक्टआईडी ("xxxx"), "टोकन": ["सी #", "प्रोग्रामिंग"], "क्षेत्र": "प्रोग्रामिंग", "शीर्षक": "सी #"}] 'जहां मान केवल पुनरावृत्ति के माध्यम से सुलभ होते हैं , जबकि 1 दस्तावेज़ से 'find_one()' मान ब्रैकेट नोटेशन के माध्यम से उपयोग किए जाते हैं? – user1063287

+0

असल में, उन लोगों के लिए, यहां एक उत्तर दिया गया है जो एक और विस्तृत उदाहरण देता है: http://stackoverflow.com/a/28970776/1063287 – user1063287

1

to_dict() एक बेटे दस्तावेज़ को सामान्य पायथन शब्दकोश उदाहरण में कनवर्ट करें।

यह केवल dict (...) की तुलना में अधिक कठिन है क्योंकि इसे रिकर्सिव होने की आवश्यकता है।

http://api.mongodb.org/python/current/api/bson/son.html

+1

कर्सर पर 'to_dict() 'को कॉल करना वास्तव में काम नहीं करता है। – RoyalTS

2

मेरा सुझाव है कि एक सूची बनाएं और इसमें शब्दकोश जोड़ें।

x = [] 
cur = db.dbname.find() 
for i in cur: 
    x.append(i) 
print(x) 

अब एक्स शब्दकोश की एक सूची है, आप सामान्य पाइथन तरीके से इसका उपयोग कर सकते हैं।

+0

हाँ, मैंने इसे समझ लिया है !! Thanls – gladys0313

+1

इसे xb के लिए x xbbname.find()] में छोटा नहीं किया जा सकता है? – jimm101

18

आसान

import pymongo 
conn = pymongo.MongoClient() 
db = conn.test #test is my database 
col = db.spam #Here spam is my collection 
array = list(col.find()) 

print array 

ये लीजिए

संबंधित मुद्दे

 संबंधित मुद्दे