使用 NodeJs 的 Mongodb 地理空间查询(Haversine 公式)

Posted

技术标签:

【中文标题】使用 NodeJs 的 Mongodb 地理空间查询(Haversine 公式)【英文标题】:Mongodb GeoSpatial Query with NodeJs (Haversine formula) 【发布时间】: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 个位置,例如起始位置和目的地位置。

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于使用 NodeJs 的 Mongodb 地理空间查询(Haversine 公式)的主要内容,如果未能解决你的问题,请参考以下文章

mongoDb地理空间索引和查询

MongoDB地理空间查询结果未按距离顺序排列

如何在 mongoDB 中存储地理空间信息

通过 GeoServer 在 MongoDB 中提供地理空间数据

通过 zip 进行 MongoDB 地理空间搜索

使用 Doctrine MongoDB ODM 进行地理空间查询