在我的nodejs应用程序上,我查询mongodb以输出给定地址周围100公里的用户。
以下是文档类型:
{
"_id" : ObjectId("5b26192e01e60e1e67e37b50"),
"loc":[2.4066412, 48.8599825]
....
}
和nodejs查询:
const distance = "100000";
User.aggregate([{
$geoNear: {
near: {type: "Point", coordinates: [ latitude, longitude ]},
distanceField: "loc",
minDistance:0,
maxDistance:distance,
spherical: true
}
}], function(err, resp){
console.log(resp)
})
此代码效果很好,我可以在指定距离附近输出用户,但是响应对象的位置已更改:
{
"_id" : ObjectId("5b26192e01e60e1e67e37b50"),
"loc": "5419.825102233618" // <=== WHY IT DOESN'T RETURN RIGHT DATA ?
....
}
有人可以向我解释为什么响应数据有这种变化?预期的输出不是:
{
"_id" : ObjectId("5b26192e01e60e1e67e37b50"),
"loc": "5419.825102233618"
....
}
但是:
{
"_id" : ObjectId("5b26192e01e60e1e67e37b50"),
"loc":[2.4066412, 48.8599825]
....
}
谢谢。
答案 0 :(得分:1)
$geoNear在地理空间索引上有效,而不是直接作用于字段上,我想这就是为什么它可能造成混淆的原因。这意味着在运行$geoNear
之前,您必须创建一个像这样的索引:
db.col.ensureIndex({ loc: "2dsphere" })
这是您唯一指定loc
作为$geoNear
输入的地方。然后,当您使用distanceField: "loc"
时,您将定义要在loc
字段中获取计算距离,该字段将简单地覆盖您的坐标。
因此,要从源文档获取距离和坐标,您应该将距离字段定义为其他键,例如:
db.col.aggregate([{
$geoNear: {
near: {type: "Point", coordinates: [2.4066412, 48.8599825]},
distanceField: "distance",
minDistance:0,
maxDistance: 10000,
spherical: true
}
}])
那么您会得到:
{ "_id" : ObjectId("5b26192e01e60e1e67e37b50"), "loc" : [ 2.4066412, 48.8599825 ], "distance" : 0 }