参考网址:http://blog.csdn.net/huangrunqing/article/details/9112227

用mongo作为存储,来实现搜索附近的人具有先天的优势,

MongoDB原生支持地理位置索引,可以直接用于位置距离计算和查询。

另外,它也是如今最流行的NoSQL数据库之一,除了能够很好地支持地理位置计算之外,还拥有诸如面向集合存储、模式自由、高性能、支持复杂查询、支持完全索引等等特性。

先看一下我在mongo中的数据存储格式:

/* 0 */
{
"_id" : "1",
"username" : "hyw",
"address" : "花园村",
"location" : [113.676557, 34.744776],
"bloodType" : "O",
"nickname" : "皇甫",
"xz" : "摩羯座",
"tel" : "123456",
"birthday" : "1989-12-13",
"sex" : "0",
"email" : "123456@qq.com"
} /* 1 */
{
"_id" : "999",
"username" : "uiouio",
"address" : "pppppp",
"location" : [113.594452, 34.742136],
"bloodType" : "x",
"nickname" : "oooo",
"xz" : "射手",
"tel" : "909090",
"birthday" : null,
"sex" : "男",
"email" : "uuuu121"
}

  其实利用mongo搜索附近的人的最主要的命令是geoNear命令,解释如下:

geoNear返回结果集中的dis,如果指定了spherical为true, dis的值为弧度,不指定则为度。不指定sphericial,结果中的dis需要乘以111换算为km:
指定 spherical为true,结果中的dis需要乘以6371换算为km:
--获取附近500米(0.5公里)的人
db.runCommand({geoNear:'userInfo',near:[113.676557,34.744778],spherical:true,maxDistance:0.5/6371,distanceMultiplier: 6371,query:{xz:'双鱼'},num:10});

其中userInfo为存储地理位置信息的集合(即关系型数据库中所谓的表),maxDistance 指定搜索的最大半径范围,query 指定其他搜索条件,num(也可以是limit)指定返回结果的条数,其他具体的参数可以参考官方文档说明http://docs.mongodb.org/manual/reference/command/geoNear/#dbcmd.geoNear

nodejs 代码就非常简单了:

/**
* 获取附近的人
*/
getNearUser:function(queryParams,callback){
var command = {};
command.geoNear = 'userInfo';
command.spherical = true;//如果指定了spherical为true, dis的值为弧度,不指定则为度
command.distanceMultiplier = 6371000;//指定 spherical为true,结果中的dis需要乘以6371换算为km:查询时指定 distanceMultiplier ,它会将这个参数乘以距离返回
var location = [];
location.push(queryParams.lng);
location.push(queryParams.lat);
command.near = location;
if(queryParams.distance){
command.maxDistance = queryParams.distance/6371000;
}
if(queryParams.rows){
command.num = queryParams.rows;
}
if(queryParams.xz){
var queryEntity = {};
queryEntity.xz = queryParams.xz;
command.query = queryEntity;
} db.mongoConn.command(command,function(err,result){
if(err){
return callback(err);
}else{
callback(null,result.results);
}
});
}

  

最新文章

  1. CSS中模拟父元素选择器
  2. Python基础9- 字典
  3. Codeforces Round #215 (Div. 2) A. Sereja and Coat Rack
  4. 【五子棋AI循序渐进】——整合完成
  5. TCP/ip协议栈之内核调优
  6. c++中两种常量方法的比较
  7. 文件浏览器及数码相框 -2.3.2-freetype_arm-2
  8. Linux C 程序 函数,数组,指针,gdb调试器(SEVEN)
  9. java设计模式和设计原则
  10. ural 1348 Goat in the Garden 2
  11. java 读excel xlsx
  12. Hive中Join的原理和机制
  13. PyCharm创建自定义代码段(JetBrains系列通用)
  14. [20171110]sql语句相同sql_id可以不同吗.txt
  15. jQuery页面加载初始化常用的三种方法
  16. 一步步构建iOS路由
  17. C++中的npos,size_t,size_type
  18. Struts2_day04讲义_使用Struts2完成用户登录的权限拦截器的代码编写
  19. ZentaoPMS 系统的优先级以及修改
  20. eclipse中支持python

热门文章

  1. Gridview 重建表头/单击单元格弹出对话框/改变单元格背景色
  2. redux三个基本原则
  3. 利用Arcgis for javascript API绘制GeoJSON并同时弹出多个Popup
  4. 【G】开源的分布式部署解决方案文档 - 手动安装
  5. windows系统下安装composer
  6. 通过 dhcp-agent 访问 Metadata - 每天5分钟玩转 OpenStack(168)
  7. 基于模糊聚类和最小割的层次化网格分割算法(Hierarchical Mesh Decomposition)
  8. Vue服务端渲染和Vue浏览器端渲染的性能对比
  9. Where T:Class,new()的使用
  10. css 样式表 基础 样式