如果我在MongoDB shell中执行以下查询,一切都很好:
db.users.find({location: {$near: [52.3, 6.6], $maxDistance: 0.27}})
但是,如果我切换参数的顺序,查询将失败:
db.users.find({location: {$maxDistance: 0.27, $near: [52.3, 6.6]}})
Mongo返回以下错误:
error: {
"$err" : "geo values have to be numbers: { $maxDistance: 0.27, $near: [ 52.3, 6.6 ] }",
"code" : 13026
}
显然,查询字典中参数的顺序很重要,这让我觉得很奇怪。有人能解释一下吗?我运行的是MongoDB 2.0.2。
所需的顺序给我带来了一个问题,因为我动态地构建字典,并且(希望)无法控制键的串行顺序(恰好是造成错误的顺序)。
一般情况下,mongodb只检查BsonDocument中的第一个元素是否有特殊的命令/查询,我想是出于性能原因。有人已经在SERVER-1990 上报告了这个问题
显然,Mongo希望某些命令使用有序字典(所谓的SON),比如$near
-查询。
在Python中,这是通过将字典强制转换为SON来完成的,如下所示:
from pymongo.son import SON
s = SON({'$near': [50, 50]})
s['$maxDistance'] = 0.27
db.users.find({'geoloc': s})