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启动服务即可