php导出mongodb,PHP使用MongoDB存储经纬度,查询距离

https://blog.csdn.net/qq_40012295/article/details/84861466

使用命令创建数据库:

use user

使用命令创建集合:

db.createCollection(user)

使用命令创建2dsphere索引:

db.user.createIndex({location: "2dsphere"})

PHP代码插入经纬度数据:

public function uploadMongoDBLocation()

{

$document = [

'name' => '张三',

'location' => [

(float)115.036545,

(float)36.313916,

],

];

$manager = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');

$bulk = new \MongoDB\Driver\BulkWrite;

$bulk->insert($document); // 可连续使用多个insert

$writeConcern = new \MongoDB\Driver\WriteConcern(\MongoDB\Driver\WriteConcern::MAJORITY, 1000);/

$res = $manager->executeBulkWrite('user.user', $bulk, $writeConcern);

return $res;

}

PHP代码查询距离:

注意:这里使用的command根据版本不同,用法可能会有区别,这里使用的MongoDB版本是3.6.5

public function findMongoDBLocation()

{

$document = [

'geoNear' => 'user',

'near' => [

'type' => 'Point',

'coordinates' => [(float)'115.042725', (float)'36.312956'],

],

'spherical' => true,

'minDistance' => 0,

'maxDistance' => 100000,

'num' => 1000

];

$command = new \MongoDB\Driver\Command($document);

$manager = new \MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');

$cursor = $manager->executeCommand('user', $command);

$items = [];

foreach ($cursor as $document) {

$total = count($document->results);

if ($total > 0) {

foreach ($document->results as $result) {

$item = json_decode(json_encode($result->obj), true);

$item['distance'] = intval($result->dis);

unset($item['_id']);

$items[] = $item;

}

}

}

return $items;

}

---------------------

作者:菜鸟阿汤

来源:CSDN

原文:https://blog.csdn.net/qq_40012295/article/details/84861466

版权声明:本文为博主原创文章,转载请附上博文链接!

https://zhuanlan.zhihu.com/p/51839804

MongoDB实现附近的人

只分享优质编程技术干货,公众号嗨码歌(ID:pxcoder)

最近腾讯把“漂流瓶”这个张小龙引以为傲的产品下架,正所谓:匹夫无罪怀璧其罪,漂流瓶本无罪,但是被一些人利用传播色情内容或广告,因此在11月30号深夜,腾讯关闭漂流瓶。那么作为微信另外的一个大家熟悉的功能“附近的人”会不会被下架呢?今天我们暂不讨论,咱们今天讨论的是附近的人怎么实现,当然实现的方式有很多种:比如Redis,MySQL,Postgresql,MongoDB等。那今天我就使用MongoDB的LBS功能实现附近的人!

一、MongoDB简介

MongoDB是一种NoSql数据库,是一个使用C++开发的高性能、开源,无模式的文档型数据库。MongoDB是面向文档的,文档以JSON格式,二进制JSON (BSON) 存储在MongoDB中。官方网站地址是:https://www.mongodb.com/。主要特点有:高性能、高可用、水平扩展能力强。支持完全索引,查询,支持服务器之间的数据复制和故障恢复。支持C++,Ruby,Java,Python,PHP,C,C#,Javascript,Perl等。

二、MongoDB与关系型数据库比较

关系型数据库概念MongoDB概念说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引

三、准备工作

下载并安装mongodb数据库,下载并安装Robomongo,如有不知可以咨询小编!

四、数据准备

往数据库中批量插入数据,use mage切换到mage数据库,执行db.user.insertMany(),user是文档名,insertMany()是批量插入命令,里面传入json数组,{'name':'杨帅哥', 'address':'江西省南昌市青山湖区市场和质量监督管理局', 'gender':1, loc:[115.993121,28.676436]}代表一条用户数据,其中gender:0代表女1,代表男,loc是一个经纬度的数组,当然也可以是loc : { lng : 115.993067 , lat : 28.67606 },但官方推荐数组。

db.user.insertMany([

{'name':'杨帅哥', 'address':'江西省南昌市青山湖区市场和质量监督管理局', 'gender':1, loc:[115.993121,28.676436]},

{'name':'王美眉', 'address':'江西省南昌市青山湖区创新一路职位小厨', 'gender':0, loc:[116.000093,28.679402]},

{'name':'张美眉', 'address':'江西省南昌市青山湖区紫阳大道1916号', 'gender':0, loc:[115.999967,28.679743]},

{'name':'李美眉', 'address':'江西省南昌市青山湖区云中城', 'gender':0, loc:[115.995593,28.681632]},

{'name':'彭美眉', 'address':'江西省南昌市青山湖区北京东路1666号', 'gender':0, loc:[115.975543,28.679509]},

{'name':'赵美眉', 'address':'江西省南昌市青山湖区市场一路大润发', 'gender':0, loc:[115.968428,28.669368]},

{'name':'廖美眉', 'address':'江西省南昌市南昌县奥林匹克中心', 'gender':0, loc:[116.035262,28.677037]},

{'name':'余帅哥', 'address':'江西省南昌市南昌县科技学院瑶湖校区', 'gender':1, loc:[116.02477,28.68667]},

{'name':'吴帅哥', 'address':'江西省南昌市青山湖区创新一路母婴店', 'gender':1, loc:[116.002384,28.683865]},

{'name':'何帅哥', 'address':'江西省南昌市青山湖区紫阳大道2999号', 'gender':1, loc:[116.000821,28.68129]},

])

五、设置2d索引

因为我以二维平面上点的方式存储的数据,想要进行LBS查询,那么要设置2d索引。db.user.createIndex({'loc':"2d"})其中loc是索引的字段。

六、查询附近200米的人

查询附近的人,首先的指导当前用户所在的经纬度,如果不仅想要得到数据还要得到距离,那么可以使用$geoNear指令,如果距离自己去计算可以使用$near或者$geoWithin然后在手动计算距离。此处采用$geoNear指令查询附近2000m的人。

db.user.aggregate({$geoNear:{near: [115.999567,28.681813], // 当前坐标

spherical: true, // 计算球面距离

distanceMultiplier: 6378137, // 地球半径,单位是米,那么的除的记录也是米

maxDistance: 2000/6378137, // 过滤条件2000米内,需要弧度

distanceField: "distance" // 距离字段别名

}

})

到这儿为止,采用mongodb的2d平面索引就能完成附近的好友搜索了,如果想要了解更多,欢迎来撩小编!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值