¿Alguien sabe un ejemplo de trabajo del índice 2dsphere en pymongo?

Estoy tratando de codificar un script para hacer una operación básica de índice de 2dsphere mencionada aquí 2dsphere usando pymongo

No pude encontrar ningún ejemplo para averiguarlo, este es mi bash hasta ahora:

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 

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

El tipo de índice 2dsphere (pymongo.GEOSPHERE) solo funciona en MongoDB 2.4 y posteriores. También vas a querer usar el formato GeoJSON para tus puntos. Finalmente, los operadores de geo consulta de MongoDB son sensibles al orden, por lo que tendrá que usar SON cuando use opciones como $ maxDistance. Aquí hay un ejemplo usando $ cerca de :

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

En las versiones más recientes, creo que $maxDistance debe estar dentro del operador $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) 

Dado que su colección tiene nombres geoides y su objeto geojson se llama geometría …

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

¡Deberias hacer eso!