Mongo - 一次查询多个位置

时间:2013-03-26 21:29:23

标签: mongodb geospatial mongodb-query

我目前正在尝试查找位于任何一个位置列表中的所有用户(此位置列表可能很大,因此执行多个查询,而不是服务器端的联合,不一定是理想的)。

例如,用例是为了找到所有居住在我当前城市任何教堂2英里范围内的用户,并给出这些教堂的坐标列表。

现在,以下位置查询有效:

db.users.count( { location: { $within: { $centerSphere: [ [-84.330984, 33.8615], 2 / 3959  ] } } } )

以及:

db.users.count( {location : { $near : [ -84.330984 , 33.8615 ] , $maxDistance : 2 / 69 }  })

但是,我希望能够计算住在不同地点的用户数量。即:像:

db.users.count( { $or: [{ location: { $within: { $centerSphere: [ [-84.330984, 33.8615], 2 / 3959  ] } } },{ location: { $within: { $centerSphere: [ [-85.331122, 34.97832], 2 / 3959  ] } } } ] } )

现在,当我运行此查询时,Mongo会提供记录错误:

Tue Mar 26 17:24:22 uncaught exception: count failed: {
"errmsg" : "exception: $or may not contain 'special' query",
"code" : 13291,
"ok" : 0
}

从此错误和打开的JIRA票证(https://jira.mongodb.org/browse/SERVER-3984),Mongo目前仅限于使用$或(或$ all)运算符执行多个位置查询,因此我无法链接位置查询。

是否有最佳实践或解决方法来实现此目标?同样,我不希望每个位置都有单独的查询,而不是将它们合并在一起;虽然我意识到这可能是唯一的选择。

我目前正在使用Mongo 2.2.3,但如果解决这个难题,升级到2.4则没有问题。

由于

1 个答案:

答案 0 :(得分:1)

如果您熟悉javascript,可以使用mapReduce来实现此目的。

但是,有两种方法,$ near和$ centerSphere,需要构建,你不能执行超过1000条记录的mapreduce。

由于mongoDB限制$或运算符,这是我想出的第一个想法来解决这个问题。

http://docs.mongodb.org/manual/applications/map-reduce/