1.基于分布式的文档存储,以BSON存储
2.和mysql比,速度:无id插入mongodb>无id mysql插入>有id mysql插入>有id mongodb插入
总体来说插入的话mysql稳定多了,如果是读的业务比较多的话建议采用mongodb,它会充分使用电脑的资源
3.如何安装mongodb
https://www.mongodb.com/ 官网下载,有点慢
我是在这里下载的https://pan.baidu.com/s/1bpo1im7
windows版本
可以在C:\mongodb中手动创建两个空文件夹 C:\mongodb\data\db C:\mongodb\log 并在C:\mongodb\log下面创建一个空的mongo.log
再创建一个mongo.config
dbpath=D:\MongoDB\data\db logpath=D:\MongoDB\log\mongo.log bind_ip=0.0.0.0 logappend=true port=27017 auth=false
!!!里面auth是是否开启验证
第一种启动
接下来在cmd右键管理员登录,输入
mongod --config D:\software\Mongodb\mongo.config --install --serviceName "MongoDB"
添加到服务里面,然后搜索服务里面是否有Mongodb的服务有的话证明成功了
另外每次修改,比如说修改auth为true时要重新启动服务
net start MongoDB
上面这个是启动服务
第二种启动
启动mongodb
mongod --dbpath C:\mongodb\data\db --logpath=C:\mongodb\log\mongodb.log --logappend
MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 –rest
mongod --dbpath=/data/db --rest
创建用户(那些db.addUser的狗带吧,应该是很久以前的版本了)
1 创建一个root用户: use admin db.createUser( { user: "root", pwd: "123456", roles: [ "root" ] } ) 2 创建admin用户 use admin db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) 3 创建具体数据库的用户 use test db.createUser( { user: "test", pwd: "password", roles: [ { role: "userAdmin", db: "test" } ] } ) 最后都要认证一下 db.auth("user", "pwd") 返回1代表成功,0代表失败。
远程连接失败,即启动auth=true后重启服务,解决方法
> use admin switched to db admin > var schema = db.system.version.findOne({"_id" : "authSchema"}) > schema.currentVersion = 3 3 > db.system.version.save(schema) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Mongodb语句
数据库的插入和查询 ./mongo show dbs;//展示所有文档 db.users.insert({'name':'liwei'});//插入数据 show collections;//展示所有的集合 db.users.find();//查看所有集合 db.users.insert({'name':'yulong','sex':nan});//插入多条数据 db.users.find({"name":"liwei"});//根据条件查找 db.users.insertMany([ {'name':'xiaohigh','age':10,'height':170}, {'name':'canglaoshi','xiongwei':'d'} ]);//插入多行数据 db.users.find(); db.users.find().toArray();//将查询到的数据,组成一个数组对象 更新 db.users.update({name:'yulong'},{$set:{age:'20'}}) 格式:db.users.update({条件},{更新的内容},upsert是否插入数据,multi是否更新多条数据) 注意:前两个是必写参数 upsert默认是false,true的话(upsert是如果找不到匹配的文档,则将插入一个新的文档到集合中。) multi默认是false 是否更新多条数据 例子: db.users.update({name:'liwei'},{$set:{chengji:60}},true); //ture代表有没有,没有的话再插入一条 db.users.insert({'name':'gaodafeng'},{$set:{tel:110}},false,true); 移除 db.users.remove({});//删除所有数据 db.users.remove({name:'yulong'});//删除带条件的数据 db.users.drop();//删除整个集合
Mongodb提供特殊的索引
https://www.cnblogs.com/firstForEver/p/6854060.html
MongoDB的一个特色就是具有丰富的查询接口,比如地理位置查询。 在地理位置查询上,MongoDB有着比传统关系型数据库的优势,下面举个例子。 当前移动互联网应用,按用户离目标门店距离排序上的场景很多。 比如: 一张门店表shop_list,表结构字段包括shop_id,shop_name,lng,lat (门店id,门店名称,以及门店的经纬度等)。 现收集到当前用户的所处位置的经纬度是,经度116.30759,纬度40.05748。获取距离用户1000m以内的100家门店,按照距离从近到远排序。 MySql的查询语句如下: 复制代码 SELECT shop_id,shop_name,lng,lat, ROUND(6378.138*2*ASIN(SQRT(POW(SIN((40.05748*PI()/180-lat*PI()/180)/2),2)+COS(40.05748*PI()/180)*COS(lat*PI()/180)*POW(SIN((116.30759*PI()/180-lng*PI()/180)/2),2)))*1000) AS distance FROM shop_list HAVING distance < 1000 ORDER BY distance LIMIT 100; 复制代码 一个这样的计算方法,显然mysql性能比较差。 下面的这个计算方法更快一些,效果和上面的几乎差不多,只是距离distance并不真实。如果只想按照距离排序查出结果是没问题的。 复制代码 SELECT shop_id , shop_name , lng , lat , POWER(lat - 40.05748 , 2) + POWER(lng - 116.30759 , 2) * POWER(COS((lat + 40.05748) / 2) , 2) AS distance FROM shop_list HAVING distance < 1000 ORDER BY distance LIMIT 100; 复制代码 换做MongoDB会如何呢? 首先,要明确MongoDB在使用距离查询时,存储的经纬度结构要类似这样才可以: 复制代码 'point' : [ 116.299, 40.053 ] 或者: 'point' : { 'lng' : 116.299, 'lat' : 40.053 } 复制代码 然后给经纬度的point做一个2dSphere索引。具体参考官方文档: db.shop_list.createIndex({"point":"2dsphere"}) 第三个用法可以得出距离值: 复制代码 #这个点的附近 db.shop_list.find({'point':{$nearSphere: [116.30759, 40.05748]}}) #这个点的附近1000米 db.shop_list.find({point: { $geoWithin: { $centerSphere: [ [ 116.30759, 40.05748 ], 1000/6378137 ] } } }) #这个点的附近1000米的10个门店,并且有距离计算值 db.runCommand({ geoNear : "shop_list" , near : [ 116.30759, 40.05748], num : 10 , spherical:true, distanceMultiplier: 6378137, maxDistance:1000/6378137})
4.第3方工具
rockmongo-on-windows-v0.0.4.zip
https://pan.baidu.com/s/1kVOPaxp
默认账号密码都是admin,在 web/rockmongo/config.php 文件里配置ip和端口再双击rockstart.bat启动服务即可