【问题标题】:Mongodb GeoSpatial Query with NodeJs (Haversine formula)使用 NodeJs 的 Mongodb 地理空间查询(Haversine 公式)
【发布时间】:2014-04-29 22:33:51
【问题描述】:

我有一个集合,我为每个条目存储 2 个位置。这些地点是 特定路线的起点和终点。我知道我可以编写以下查询来查找附近的地点以查询特定位置:

exports.nearby = function(req, res){
db.testpool.find({
    fromLoc: {
        $near: [28.423168, 77.045639],
        $maxDistance: 1
    },

}).toArray(function(err, doc){
    res.send(doc);
    if(err)
        console.log(err+'');
    else
    {
        res.send(doc+'');
    }});

但我不知道我应该进行哪些查询才能找到相关路线 不仅匹配 fromLoc 还匹配 toLoc ,当我做这样的事情时,我不断收到错误:-

exports.nearby = function(req, res){
db.testpool.find({
    fromLoc: {
        $near: [28.423168, 77.045639],
        $maxDistance: 1
    },
    toLoc: {
        $near: [28.649573, 77.125284],
        $maxDistance: 1
    }
}).toArray(function(err, doc){
    res.send(doc);
    if(err)
        console.log(err+'');
    else
    {
        res.send(doc+'');
    }
});

所以基本上我想找出用户输入的最相关的拼车 每个条目 2 个位置,例如起始位置和目的地位置。

【问题讨论】:

    标签: node.js mongodb geolocation geospatial


    【解决方案1】:

    现在每个集合不能有多个地理空间索引*。如果你想要两个索引,你至少需要两个不同的集合。 MongoDB 没有连接,但您可以创建指向其他地方的另一个文档的字段。这些被称为DBRefs 并且比正确连接最不强大,但可以用于类似目的。 node.js 驱动程序中的那些“伪连接”支持一些策略,例如mongoose's populate

    至少在 mongoDB 支持多个地理空间索引之前,您将无法使用简单的查询来做您想做的事情。您需要对其进行编码。

    例如,我们可以有两个集合。一个是路线,另一个是位置。位置类似:

    {
       "geo": [1,2],
       "origin": [/*dbrefs array*/],
       "destination": [/*dbrefs array*/]
    } 
    

    然后我们进行两个查询,一个搜索起点附近的地方,另一个搜索目的地附近的地方。当我们已经有了两个查询的结果时,我们对第一个查询的源字段的intersection 和第二个查询的目标字段进行处理。要比较两个对象,您可以使用deepEqual in the assert library

    var intersection = originField.filter(function(origin){
        for(var k in destinationField){
            if(deepEqual(destinationField[k],origin)){
                return true;
            };
        };
    
        return false;
    })
    

    我们有所需路由的 DBRefs,其中包含它的集合 ant _id,所以现在我们只需要查询这些路由。连续使用$in

    希望这会有所帮助。

    *在 mongodb 的 jira 中检查 issue 2331

    【讨论】:

      猜你喜欢
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多