我使用几个文档创建了一个虚拟集合位置:
{
"_id": ObjectId("56b1c6c32798710b058b4568"),
"title": "place1",
"coords": {
"lng": -77.0057694,
"lat": 38.8844788
}
}
{
"_id": ObjectId("56b1c8032798710c058b4567"),
"title": "place2",
"coords": {
"lng": -77.042787,
"lat": 38.926703
}
}
“coords”字段有一个 2d 索引:
/** locations indexes **/
db.getCollection("locations").ensureIndex({
"coords": "2d"
},[
]);
以下查询返回0结果,但我希望它返回两个文档:
{
"coords": {
"$near": {
"lng": -77.023362,
"lat": 38.901002
},
"$maxDistance": 0.002
}
}
两个文件中各点之间的距离约为6公里,而查询中的点位于其中间,$ maxDistance约为13公里(13 / 6391~ = 0.002弧度)
为什么它不起作用的任何想法?
MongoDB v.3.0.1
答案 0 :(得分:4)
我注意到您的收藏文件不符合地理空间索引和查询的legacy format或GeoJSON format。
使用地理空间数据构建集合时,请确保不要混合使用两种不同的格式。我建议使用GeoJSON格式继续前进:
{ "title" : "place1",
"coords" : {
"type" : "Point",
"coordinates" : [ -77.0057694, 38.8844788 ]
}
}
{ "title" : "place2",
"coords" : {
"type" : "Point",
"coordinates" : [ -77.042787, 38.926703 ]
}
}
创建集合后,我们需要在坐标上创建2dsphere index:
db.yourCollection.createIndex({coords:"2dsphere"})
使用创建的集合和索引,我们现在必须使用$nearSphere查询数据集:
db.yourCollection.find({ "coords": { $nearSphere:[-77.023362,38.901002],$maxDistance: 0.002 } })
当我在我的机器上运行上述场景时,这是我得到的输出:
db.yourCollection.find({ "coords": { $nearSphere:[-77.023362,38.901002],$maxDistance: 0.002 } })
{ "_id" : ObjectId("56bd1153439b16ea3a0847ed"), "title" : "place1", "coords" : { "type" : "Point", "coordinates" : [ -77.0057694, 38.8844788 ] } }
{ "_id" : ObjectId("56bd1249439b16ea3a0847ee"), "title" : "place2", "coords" : { "type" : "Point", "coordinates" : [ -77.042787, 38.926703 ] } }
最后,请确保使用MongoDB的最新稳定版本来修复错误和一般增强功能。目前,对于v3.0,它是v3.0.9,对于v3.2,它是v3.2.1