参考网址: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. ASP.NET MVC创建视图过程

    MvcHandler.ProcessRequest()   (1)获取Action执行结果:context2.Result ActionExecutedContext context2 = this. ...

  2. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  3. iOS多线程——GCD

    最近的项目遇到了很多多线程的问题,借此机会对GCD进行了一番学习并总结.首先说一下什么是GCD,GCD全称 Grand Central Dispatch,是异步执行任务的技术之一.开发者只需要定义想要 ...

  4. jqzoom插件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...

  5. 关于Android开发的几点建议

    绝不要在UI线程中做数据处理的工作,这会让你的app变慢,带来极差的用户体验. 要按照google发布的Design指导意见来设计app,比如一个holo主题app会给用户带来更好的用户体验. 不要复 ...

  6. vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)

    使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...

  7. iOS 10 语音识别Speech Framework详解

    最近做了一个项目,涉及到语音识别,使用的是iOS的speech Framework框架,在网上搜了很多资料,也看了很多博客,但介绍的不是很详细,正好项目做完,在这里给大家详解一下speech Fram ...

  8. 数据库DDL操作

    DDL1. 数据库* 查看所有数据库:SHOW DATABASES* 切换(选择要操作的)数据库:USE 数据库名* 创建数据库:CREATE DATABASE [IF NOT EXISTS] myd ...

  9. SERVLET中的doGet与doPost两个方法之间的区别

    get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串.post的参数是通过另外的 ...

  10. C# 快速高效率复制对象另一种方式 表达式树

    1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } publi ...