7

ここで言及されている基本的な2dsphereインデックス操作を実行するスクリプトをコード化しようとしています 2dsphere pymongoを使用しています。

私はそれを理解するための例を見つけることができませんでした.これはこれまでの私の試みです:

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

エラーが発生しますpymongo.errors.OperationFailure: database error: can't find special index: 2d for: { loc: { $near: { $geometry: { type: "Point", coordinates: [ 1, 2 ] }, $maxDistance: 20 } } }

4

3 に答える 3

11

2dsphere ( pymongo.GEOSPHERE ) インデックス タイプは、MongoDB 2.4 以降でのみ機能します。また、ポイントにGeoJSON形式を使用することもできます。最後に、MongoDB の geo クエリ演算子は順序に依存するため、$maxDistance などのオプションを使用する場合はSONを使用する必要があります。$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')}
于 2013-06-06T19:41:55.783 に答える
4

最近のバージョンでは、オペレーター$maxDistance内にある必要があると私は信じています:$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)
于 2015-12-03T11:46:25.877 に答える