您的位置:首页 > 数据库 > Mongodb

mongodb 计算坐标距离

2016-08-16 22:25 1391 查看
使用场景很多 ,不瞎比比了 ,直接上案例。

创建数据集合location:

db.location.insert({loc:[1,3]});
db.location.insert({loc:[3,4]});
db.location.insert({loc:[0,-3]});
db.location.insert({loc:[-6,2]});
db.location.insert({loc:{x:9,y:5}});
db.location.insert({loc:{lng:-9.2,lat:21.3}});


查看数据:

db.location.find()




注意:一定要建立2d索引,否则不能计算距离(我在这里掉坑了)

db.location.ensureIndex({"loc":"2d"})


使用geoNear计算距离:

使用runCommand来执行geoNear命令。

db.runCommand({
"geoNear":"location",   //指定要在那个数据集里查询
“near” : [0,0]          //指点参与计算的目标点
})


默认会查询出前100条数据

db.runCommand({"geoNear":"location","near":[0,0]})
{
"waitedMS" : NumberLong(0),
"results" : [
{
"dis" : 3,
"obj" : {
"_id" : ObjectId("57b313b9190404253628744e"),
"loc" : [
0,
-3
]
}
},
{
"dis" : 3.1622776601683795,
"obj" : {
"_id" : ObjectId("57b313b9190404253628744c"),
"loc" : [
1,
3
]
}
},
{
"dis" : 5,
"obj" : {
"_id" : ObjectId("57b313b9190404253628744d"),
"loc" : [
3,
4
]
}
},
{
"dis" : 6.324555320336759,
"obj" : {
"_id" : ObjectId("57b313b9190404253628744f"),
"loc" : [
-6,
2
]
}
},
{
"dis" : 10.295630140987,
"obj" : {
"_id" : ObjectId("57b313b91904042536287450"),
"loc" : {
"x" : 9,
"y" : 5
}
}
},
{
"dis" : 23.201939574095956,
"obj" : {
"_id" : ObjectId("57b313be1904042536287451"),
"loc" : {
"lng" : -9.2,
"lat" : 21.3
}
}
}
],
"stats" : {
"nscanned" : 18,     //在数据库操作期间扫描的索引项的总数
"objectsLoaded" : 6, //在数据库操作期间加载的数据项
"avgDistance" : 8.497400449264683,
"maxDistance" : 23.201939574095956,
"time" : 1           //查询使用的时间 毫秒作单位
},
"ok" : 1
}


在数据集环境中使用geoNear命令:

使用聚合查询,通过管道机制,能够方便的对数据进行过滤和排序等

db.location.aggregate({
$geoNear:{
near:[10,2],
distanceField:"distance"    //指定查询出来的距离数据的别名
}
})


查询结果:

{ "_id" : ObjectId("57b313b91904042536287450"), "loc" : { "x" : 9, "y" : 5 }, "distance" : 3.1622776601683795 }
{ "_id" : ObjectId("57b313b9190404253628744d"), "loc" : [ 3, 4 ], "distance" : 7.280109889280518 }
{ "_id" : ObjectId("57b313b9190404253628744c"), "loc" : [ 1, 3 ], "distance" : 9.055385138137417 }
{ "_id" : ObjectId("57b313b9190404253628744e"), "loc" : [ 0, -3 ], "distance" : 11.180339887498949 }
{ "_id" : ObjectId("57b313b9190404253628744f"), "loc" : [ -6, 2 ], "distance" : 16 }
{ "_id" : ObjectId("57b313be1904042536287451"), "loc" : { "lng" : -9.2, "lat" : 21.3 }, "distance" : 27.223702907576
698 }


更多参数见$geoNear (aggregation)

另外 $geoWithin 可以计算某点与几何图行的距离
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: