问题描述
执行查询语句,使用 $nearSphere
db.xxx.find({
"gp": {
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [
121.473183,
31.226972
]
},
"$minDistance": 0,
"$maxDistance": 1000
}
}
})
得到了如下的报错:
'planner returned error: unable to find index for $geoNear query' on server x.x.x.x:27017
解决方案
这是因为当前查询的是MongoDB的GeoJSON 对象,查询中使用了地理空间查询运算符:$nearSphere, 而使用它则需要地理空间索引,而定义为 GeoJSON 点的位置数据的索引为2dsphere索引。
故首先创建 2dsphere 类型的索引,如下语句:
db.xxx.createIndex({gp:"2dsphere"});
然后可以通过提供一个geoJson 对象来查询,如下语句:
db.xxx.find({
"gp": {
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [
121.473183,
31.226972
]
},
"$minDistance": 0,
"$maxDistance": 1000
}
}
})
官网示例
- 使用 GeoJSON 指定中心点
- 查询一个如上xxx集合,包含带有字段(如上的gp字段)的文档并具有2dsphere索引。
- 查询返回其距离指定点 gp 至少
1000
米和最多5000
米,从最近到最远排序的查询示例如下: -
db.xxx.find( { gp: { $nearSphere: { $geometry: { type : "Point", coordinates : [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } } )