2013-06-04 18 views
5

Pymongo kullanarak burada belirtilen temel 2dsphere dizin işlemini 2dsphere yapmak için bir komut dosyası hazırlamaya çalışıyorum.Pymongo'da çalışan bir 2dsphere indeksi örneği var mı?

Ben bunu anlamaya herhangi bir örnek bulamadık

, bunun şimdiye kadar benim girişimi:

from pymongo import GEOSPHERE 
client=MongoClient('localhost',27017) 
db=client['dbtest'] 
points=db['points'] 
points.create_index([("loc",GEOSPHERE)]) 
points.insert({"loc":[2 5]}) 
points.insert({"loc":[30,5]}) 
more points.insert 

for doc in points.find({"loc" : {"$near": { "$geometry" : {"type":"Point","coordinates":[1,2]},"$maxDistance":20}}}): 
    print doc 

O pymongo.errors.OperationFailure: database error: can't find special index: 2d for: { loc: { $near: { $geometry: { type: "Point", coordinates: [ 1, 2 ] }, $maxDistance: 20 } } }

+0

Denemeniz benim makinem üzerinde çalışıyor, ancak maxDistance'ı çok büyük bir sayıya ayarladım. Hangi MongoDB sürümünü kullanıyorsunuz? MongoDB 2.4.3 kullanıyorum. – vinipsmaker

cevap

8

2dsphere (pymongo.GEOSPHERE) endeks türü sadece çalışır hata veriyor MongoDB 2.4 ve daha yeni. Ayrıca puanlarınız için GeoJSON biçimini kullanmak isteyeceksiniz. Son olarak, MongoDB'nin coğrafi sorgu operatörleri siparişe duyarlı olduğundan, $ maxDistance gibi seçenekleri kullanırken SON'u kullanmanız gerekir. En son sürümlerinde

>>> c = pymongo.MongoClient() 
>>> points = c.dbtest.points 
>>> points.ensure_index([("loc", pymongo.GEOSPHERE)]) 
u'loc_2dsphere' 
>>> points.insert({'loc': {'type': 'Point', 'coordinates': [40, 5]}}) 
ObjectId('51b0e508fba522160ce84c3a') 
>>> for doc in points.find({"loc" : SON([("$near", { "$geometry" : SON([("type", "Point"), ("coordinates", [40, 5])])}), ("$maxDistance", 10)])}): 
...  doc 
... 
{u'loc': {u'type': u'Point', u'coordinates': [40, 5]}, u'_id': ObjectId('51b0e508fba522160ce84c3a')} 
+0

Moğol versiyonum 2.4.0 ve bu örnek çalışmadı. – gizgok

+0

2.4.4'e yükseltmek isteyebilirsiniz. Kullandığım versiyonun bu olduğuna inanıyorum. –

+0

Ancak bu örnek, 2dsphere sorgusunu kullanmıyor. – Matthias

4

Ben $maxDistance$near operatör içinde olmalıdır inanıyoruz: Burada $near kullanıldığı bir örnek

from bson.son import SON 
from pymongo import MongoClient 

db = MongoClient() 
latitude = 10 
longitude = 20 
max_distance = 1000 #meters  

query = {'loc': {'$near': SON([('$geometry', SON([('type', 'Point'), ('coordinates', [longitude, latitude])])), ('$maxDistance', max_distance)])}} 

for doc in db.database_name.collection_name.find(query): 
    print(doc) 
+0

'un aşağısına bakın, bu sorgu filtresi doğrudur – xyCoder

0

Verilen koleksiyonunuzu Jeoit isimleri olduğunu ve GeoJSON nesne geometri ismi ...

import pymongo 

geoid.create_index([("geometry", pymongo.GEOSPHERE)]) 

Bunu yapmalı!

İlgili konular