参考网址: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);
}
});
}

  

nodejs+mongo 实现搜附近的人的更多相关文章

  1. Nodejs+Mongo+WebAPI

    Nodejs+Mongo+WebAPI集成 1.[ 目录]: |- models/bear.js |- node_modules/ |- express |- mongoose |- body-par ...

  2. [代码]解析nodejs的require,吃豆人的故事

    最近在项目中需要对nodejs的require关键字做解析,并且替换require里的路径.一开始我希望nodejs既然作为脚本语言,内核提供一个官方的parser库应该是一个稳定可靠又灵活的渠道,然 ...

  3. 【nodejs笔记4】搭建多人博客<内含http请求的get post方法区别>

    功能分析 博客具有四个功能:注册  登录  登出  发表文章 界面设计 未登录: [主页  注册页  登录页] [主页] 主页 左侧 HOME                             ...

  4. nodejs&mongo&angularjs

    http://www.ibm.com/developerworks/cn/web/wa-nodejs-polling-app/

  5. nodejs调用百度统计api摆脱人肉数据统计

    var http = require("https"); var url = require('url'); var postData = JSON.stringify( { &q ...

  6. 十个最适合 Web 和 APP 开发的 NodeJS 框架

    在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来 ...

  7. 10 个最适合 Web 和 APP 开发的 NodeJS 框架

    在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来 ...

  8. nodejs 回调地狱解决 promise async

    nodejs毁掉地狱是一直被人诟病的,以下总结一下解决毁掉地狱的一些方法.(暂时研究的比较浅) 1.promise promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled) ...

  9. mongo&node

    /////  node install $ sudo apt-get install python-software-properties $ curl -sL https://deb.nodesou ...

随机推荐

  1. multiSelect 下拉多选插件

    multiSelect是一款很好用的下拉多选插件,可以在下拉框中实现多选框,全选及取消全选等方法.使用方法:1.引用 multiSelect.css及 multiSelect.js.下载地址 http ...

  2. PHP测试题讲解(20161027)

    注: 关联数组 关联数组,它的每个 ID 键都关联一个值.在存储有关具体命名的值的数据时,使用数值数组不是最好的做法.通过关联数组,我们可以把值作为键,并向它们赋值. 例子 1 在本例中,我们使用一个 ...

  3. 3.WP8.1开发_为控件增加动画

    示例: 把一个按钮的宽度从100变到500 根据WPF的经验,会把代码写成如下: <Grid> <Button x:Name="btn" Content=&quo ...

  4. 老司机实战Windows Server Docker:3 单节点Windows Docker服务器简单运维(上)

    经过上两篇实战Windows Server Docker系列文章,大家对安装Windows Docker服务以及如何打包现有IIS应用为docker镜像已经有了基本认识.接下来我们来简单讲讲一些最基本 ...

  5. Linux下python开发环境的准备

    升级python 安装依赖: yum install lrzsz zlib zlib-devel  openssl  readline-deve gcc  ibffi-devel python-dev ...

  6. h5 做app时和原生交互的小常识。

    距离上次随笔或许有半年了吧,最近在用hybrid模式开发移动app,所以就简单的说说用h5技术开发app时候,做原生交互的几个小常识: 一.拨打电话或者发送短信: <a href="t ...

  7. Codeforces 765E. Tree Folding [dfs][树形dp]

    题解:先从节点1开始dfs.对于每一个节点,用一个set记录:以该点为根的子树的深度. a) 如果此节点的某个子节点打出了GG,则此节点直接打出GG. b) 若set的元素个数<=1,那么,以该 ...

  8. 天气渐热,来片雪花降降温——Android自定义SurfaceView实现雪花效果

    实现雪花的效果其实也可以通过自定义View的方式来实现的(SurfaceView也是继承自View的),而且操作上也相对简单一些,当然也有一些不足啦... 相对于View,SurfaceView有如下 ...

  9. 封装Echarts

    项目中需要对数据进行图形展示,例如展示柱状图.饼状图等.这类的前端展示脚本很多,常见的是HighCharts和Echarts.HighCharts是基于svg技术的,而echarts基于Echarts ...

  10. DAM的使用结合串口和中断以及GPIO。

    DAM的使用结合串口和中断以及GPIO. 当我学到DMA这章的时候就意味着我已经学完了,GPIO里的LED,按键,还有就是串口发送数据. 那么下面就来总结下前段时间所学的知识(因为接下来有断时间我是没 ...