我正在尝试从我的地方集合中获得一些接近坐标的结果。为此,我在location.position属性上使用了2d索引,该属性具有lng和lat属性。
问题在于我放置的每个坐标,它返回相同的60个结果(整个集合)。
我的收藏中的文档都是从我的GPS坐标附近,但是,如果我放置0.0,0.0坐标或任何其他对,它总是返回相同的。
实际上,如果我使用空的find(),则查询返回完全相同。
索引似乎是正确创建的,因为它没有返回任何错误。
我的收藏中的一个对象是这样的:
{ "_id" : "80293840923...",
"name": "myname",
"location" : {
"position" : { "lng": -196988, "lat": 43.30594 }
"address": "example",
"city": "example" }
}
索引创建如下:
places_collection.ensureIndex({"location.position": "2d"}, {name: "index2dLocation"}, function(error, indexName){
callback("", "Indice creado: " + indexName)
});
搜索结果如下:
places_collection.find(
{ "location.position" : { $near : [ parseFloat(-123.98) , parseFloat(162.342) ] } }
).toArray(function(error, results) {
if( error ){ callback(error, "")
}else{ console.log(results.length); callback(null, results); }
});
最后,如前所述,我的搜索返回总是相同的结果。它不关心我是否放置一个坐标或另一个坐标。即使它不关心我是否做空的find()。
请帮忙吗?我不知道如何让它发挥作用。
非常感谢。
答案 0 :(得分:1)
最后,解决方案是添加$maxDistance
属性以避免所有文档都超出$maxDistance
中的半径。
如果您没有放置该属性,并且您只有10个文档位于一个坐标附近,如果您在很远的坐标中进行查找,它仍将返回相同的10个文档,因为您没有更多的文档靠近新坐标。
此外,重要的是要说$maxDistance
的单位是度,所以这是我的解决方案:https://stackoverflow.com/a/7841830/974828
要将度数转换为公里,您必须除以111.12。
所以结果如下:
db.places.find( { loc : { $near : [50,50] , $maxDistance : 1/111.12 } } )