草庐IT

node.js - Mongodb GeoSpatial Query with NodeJs (Haversine formula)

coder 2023-11-01 原文

我有一个集合,我为每个条目存储了 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 个位置,例如起始位置和目标位置。

最佳答案

现在每个集合不能有多个地理空间索引*。如果你想要两个索引,你将需要至少两个不同的集合。 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 连续做.

希望这对您有所帮助。

*检查问题 2331在 mongodb 的 jira 中。

关于node.js - Mongodb GeoSpatial Query with NodeJs (Haversine formula),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22577730/

有关node.js - Mongodb GeoSpatial Query with NodeJs (Haversine formula)的更多相关文章

随机推荐