mongodb和nodejs geonear响应更改位置?

时间:2018-07-04 22:06:54

标签: node.js mongodb

在我的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]
    ....
}

谢谢。

1 个答案:

答案 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 }