使用 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 公式)的主要内容,如果未能解决你的问题,请参考以下文章