nodejs+mongo 实现搜附近的人

参考网址: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" : "[email protected]"
}

/* 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);
            }
        });
    }

  

时间: 2024-10-11 22:14:03

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

cs硕士妹子找工作经历【阿里人搜等互联网】

摘自  北邮人论坛  分享他人成功的求职经历.原文如下: 唉,妹子本来是本着写面经的态度与大家分享,之自己情况也是想说明一啥都不会的菜鸟在悲催的逆境下也可以凭自身努力找到offer,没想到被评为作秀...妹子能力背景确实和说的一样,但是从9月开始不是天天熬夜看了一个多月的书吗?菜鸟也可以拼命锻炼翅膀的... 妹子还是把背景舍去,只写面经吧   妹子是cs土著一枚,折腾了半年找工作,现在貌似也是尘埃落定了,手里还有2个offer待定,还在纠结中. 妹子开始找工作时间挺晚,是9月7号左右,之前完全没

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

在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来说,Node.js 是 JavaScript 运行时,允许你在浏览器之外服务器上运行 JavaScript 代码.它是基于谷歌 Chrome 的 V8 虚拟机引擎建立的,V8 虚拟机引擎用于在 Chrome 浏览器中支持 JavaScript. NodeJS 逐渐普及的步伐是因为它可以让你只使用 J

mongo&node

/////  node install $ sudo apt-get install python-software-properties $ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - $ sudo apt-get install nodejs /// mongo install sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E

nyoj 999——师傅又被妖怪抓走了——————【双广搜】

师傅又被妖怪抓走了 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥餐渴饮,悟空便为师傅去化斋,等悟空回来,悟净慌慌张张的对悟空说:“不好了,不好了”,还没等悟净说完,悟空说:“师傅又被妖怪抓走了”,悟净:“NO!” ,悟空一脸茫然,悟净:“师傅和二师兄都被妖怪抓走了”.悟空(晕!).为了防止悟空救人,妖怪先把唐憎和八戒分别藏起来,如果悟空在T分钟之后还没找到人,那必定是被妖怪吃

2017年-Web前端面试题(HTML至Nodejs)

[原]2017年-Web前端面试题(HTML → Nodejs)   出自作者小矮人Web前端,博文地址:http://www.cnblogs.com/itlkNote/  文中有少许重复问题! 第一阶段 HTML.CSS.HTML5.CSS3 1.XHTML与HTML的有何异同? 2.介绍一下CSS的盒子模型?弹性盒子模型是什么? 3.Doctype的作用?标准模式与兼容模式各有什么区别? 4.HTML5 为什么只需要写 <!DOCTYPE HTML>? 5.行内元素有哪些?块级元素有哪些?

nodejs【伪】入门教程

声明: 本文适合白的不能再白的小白 不要被标题误导,本文不会讲nodejs基础,只是本人学习流程和资料的一个整合 如果想找一大堆教程自己看,没有电梯,自己拉到文章最下方吧 一.nodejs是什么 前段时间,偶然得到了一次跟几个大牛学长学习的机会,他们正在做一个startup的项目,构建网站所使用的就是nodejs;对这个最近牛哄哄的东西,自己也只是略有耳闻,从何下手呢,打开百度,google一下. 首先,nodejs不是一种什么编程语言,而是一个可以让javascript运行在服务器端的平台,至

nodejs 回调地狱解决 promise async

nodejs毁掉地狱是一直被人诟病的,以下总结一下解决毁掉地狱的一些方法.(暂时研究的比较浅) 1.promise promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled).已完成(resolved)和拒绝(rejected).以CommonJS Promise/A 标准为例,promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数.then方法会返回另一个promise对象,以便于形成promise管道,这种返回promise对象的方式能够支持开发

2017年-Web前端面试题(HTML至Nodejs)(转)

[原]2017年-Web前端 面试题(HTML → Nodejs)   出自作者小矮人Web前端,博文地址:http://www.cnblogs.com/itlkNote/  文中有少许重复问题! 第一阶段 HTML.CSS.HTML5.CSS3 1.XHTML与HTML的有何异同? 2.介绍一下CSS的盒子模型?弹性盒子模型是什么? 3.Doctype的作用?标准模式与兼容模式各有什么区别? 4.HTML5 为什么只需要写 <!DOCTYPE HTML>? 5.行内元素有哪些?块级元素有哪些

知乎之友:XML与Python爬虫与爬虫代理

作者:一只尼玛链接:https://www.zhihu.com/question/25052291/answer/107829888来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 我来回答这个弱智的问题. 什么是xml,什么是excel? 她们两种都是一种文件格式,属于文本文件.计算机里面要存放数据,一般都是存放在文件中,有些是文本文件,有些是二进制文件,比如图片是二进制文件,你用文本编辑器打开会看到乱码,而一些文件打开,你大致读得懂就是文本文件.数据库存放的数据