我有一个集合,我为每个条目存储了 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/