2015-03-10 14 views
21

Bir bölgedeki tüm öğeleri sorgulamak için pymongo kullanıyorum (aslında bir haritadaki bir bölgedeki tüm mekanları sorgulamaktır). Önce bir sözlükte arama yapabilmem için küresel bir bölgede arama yapmak için db.command(SON()) kullanmıştım ve sözlükte, mekanları içeren results adlı bir anahtar var. Şimdi bir kare alanda arama yapmam gerekiyor ve ben db.places.find'u kullanmam öneriliyor, ancak bu bana pymongo.cursor.Cursor sınıfını döndürüyor ve mekan sonuçlarını nasıl çıkaracağımı bilmiyorum.Bir pymongo.cursor.Cursor bir dict dönüştürmek nasıl?

İmleci bir kurgusuna dönüştürüp dönüştürmemeyi ve sonuçları çıkarmamı veya kare bir bölgedeki öğeleri sorgulamak için başka bir yöntem kullanmam gerektiğini bilen var mı? BTW, db kodları pymongo.database.Database sınıf

geçerli:

>>> 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) 

Ben bu değerleri kullanmak, ll_lng, ll_lat, ur_lng ve ur_lat ait değerlere sahip ancak bu kodları hiçbir şey yazdırır

+1

Sen sözlükleri listesini tedavi ederdin aynı şekilde döndürülür pymongo imleci davranabilirsiniz gidin. – dursk

+2

@dursk Ancak, imleç yok edilmeden önce yalnızca imleci dolaşabilirsiniz, böylece her sonucu bir dikdörtgenin listesinde kaydettiğinizden emin olmalısınız. – Rohmer

cevap

29

find yöntem döner tüm eşleşen belgeleri üzerinde yineleme sağlayan bir Cursor örneği döndürür.

Belirtilen ölçütlerle eşleşen ilk belgeyi almak için find_one'u kullanmanız gerekir. find_one sonucu bir sözlüktür.

Koleksiyondaki tüm belgelerin listesini döndürmek için her zaman list yapıcısını kullanabilirsiniz, ancak bunun tüm verileri belleğe yükleyeceğini ve istediğiniz gibi olmayabilir.

Sen imleci yeniden gerekiyor ve varsa iyi bir sebep kullanmamaya arasan

rewind()


Demo find kullanarak:

>>> 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} 

Demo kullanarak find_one:

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

MongoDB find yöntemi tek bir sonuç döndürmez, ancak sonuçların bir listesi Cursor biçimindedir. Bu ikincisi bir yineleyicidir, böylece bir for döngü ile devam edebilirsiniz.

Sizin durumunuz için, find yerine findOne yöntemini kullanın. Bu size tek bir belgeyi sözlük olarak döndürecektir.

+0

Bulgu() ve bul_one() sonuçlarının nasıl göründüğüne dair daha iyi bir görsel anlayış elde etmeye çalışıyorum, bu yüzden açıklığa kavuşturmak için, şu kesin cevaptır: “İmleç”, “dicts” ın bir “listesi” dir Veritabanından eşleşen belgelerin bir listesini temsil eden? örn .: imleç = [{"_id": ObjectId ("xxxx"), "token": ["Python", "Programlama"], "alan": "Programlama", "title": "Python"}, { "_id": ObjectId ("xxxx"), "token": ["C#", "Programlama"], "alan": "Programlama", "title": "C#"}] 'burada değerler sadece yineleme ile erişilebilir iken, 1 doc'dan 'find_one()' değerleri parantez notasyonu ile erişilirken? – user1063287

+0

Aslında, arayanlar için burada daha ayrıntılı bir örnek veren bir cevap var: http://stackoverflow.com/a/28970776/1063287 – user1063287

2

Bir liste oluşturup ona sözlük eklemeyi öneririm.

Artık x bir sözlük listesidir, her zamanki python yöntemiyle aynı işlemi yapabilirsiniz. Kolay

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 

+0

evet, anladım! Thanls – gladys0313

+1

Bu, [db.dbname.find()] 'da x için kısaltılamaz mı? – jimm101

18

Orada

İlgili konular