2013-06-04 11 views
5

Sto provando a codificare uno script per fare l'operazione di base sull'indice 2dsphere menzionata qui 2dsphere usando pymongo.Qualcuno conosce un esempio funzionante di indice 2dsphere in pymongo?

non ho potuto trovare alcun esempio per capirlo, questo è il mio tentativo finora:

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 

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

+0

Il tuo tentativo sta funzionando sul mio computer, ma ho impostato maxDistance su un numero molto grande. Che versione di MongoDB stai usando? Sto usando MongoDB 2.4.3. – vinipsmaker

risposta

8

Il tipo 2dsphere (pymongo.GEOSPHERE) Indice funziona solo in MongoDB 2.4 e successivi. Inoltre, vorrai utilizzare il formato GeoJSON per i tuoi punti. Infine, gli operatori di query geo di MongoDB sono sensibili agli ordini, quindi sarà necessario utilizzare SON quando si utilizzano opzioni come $ maxDistance. Ecco un esempio di utilizzo $near:

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

La mia versione di mongo è la 2.4.0 e questo esempio non ha funzionato. – gizgok

+0

È possibile eseguire l'aggiornamento a 2.4.4. Credo che sia stata la versione che ho usato. –

+0

Ma questo esempio non sta utilizzando la query 2dsphere. – Matthias

4

Nella maggior parte dei recenti versioni Credo $maxDistance deve essere all'interno dell'operatore $near:

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

con l'indice 2dspace di costruzione, questo filtro di query è corretto – xyCoder

0

Data la tua collezione è nomi geoide e l'oggetto GeoJSON si chiama geometria ...

import pymongo 

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

Questo dovrebbe farlo!

Problemi correlati