使用场景很多 ,不瞎比比了 ,直接上案例。
创建数据集合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 }
另外 $geoWithin 可以计算某点与几何图行的距离