我尝试使用MongoDB geo
查询$maxDistance
。但它不适用于PyMongo
和AsyncMongo
的 AsyncMongo
self.application.asyncdb.places.find({"loc":{"$near":[longitude, latitude], "$maxDistance":1000}}, limit=20, callback=self.showNearByPlaces)
的 PyMongo
placeColl = self.application.db.places
cursorObj = placeColl.find({"loc": {"$near":(longitude, latitude)},"$maxDistance":1000})
答案 0 :(得分:1)
以下是使用PyMongo 2.6.3和MongoDB 2.4.8的示例:
>>> from pymongo import MongoClient
>>> from bson import SON
>>> c = MongoClient()
>>> collection = c.db.collection
>>> collection.drop()
>>> collection.create_index([('loc', '2d')])
u'loc_2d'
>>> collection.insert({'loc': [1, 1]})
ObjectId('52d19a5eca1ce961b94f23f4')
>>> collection.insert({'loc': [3, 3]})
ObjectId('52d19a69ca1ce961b94f23f5')
>>> list(collection.find({'loc': SON([('$near', [0, 0]), ('$maxDistance', 2)])}))
[{u'loc': [1, 1], u'_id': ObjectId('52d19a5eca1ce961b94f23f4')}]
您可以看到结果中包含[0,0]的2个单位内的点,并且排除了更远的点。
与大多数MongoDB查询不同,$near
查询要求密钥按特定顺序排列。 $near
必须在$maxDistance
之前,而不是之后。由于常规Python dicts不保留键的顺序,我使用了bson.SON
,它是作为PyMongo包的一部分安装的。 SON
就像字典,但保留了顺序。