最热门的非关系型数据库,C++语言编写,不用建表,甚至都不要密码

Mongo是humongous的简写,巨大的意思。
NoSql非关系型数据库
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"(不是不是SQL的意思)。
不需要预先设置表字段,很灵活。
访问不需要密码
初始访问是不需要账号密码的,但是使用时为了安全,最好还是加上。
数据结构是BTree
B-Tree在大数据方面没有B+Tree性能强,但对于MingoDB本来就不是用来保存大量数据的,更适合随机查询。
一个data一个库,一个引擎可以维护多个库
很奇怪的地方,本地搭建集群,只要多创建几个配置文件,data文件夹和log文件夹,然后按照不同的配置文件启动即可,当然意义不大,真正的集群要在不同的机子上搭建;可能其他的数据库也是这种结构,引擎,data,日志,三个部分。
使用JS脚本语言操作
创建集合
db.createCollection("集合名")
查询
db.集合名.find({key1:value1, key2:value2}).pretty()
没有事务,表关联弱
舍弃了事务
BSON
称Binary JSON就是存二进制的json,优点:效率更高;缺点:占空间。
索引,竟然还有地理索引
和mysql索引差不多,也是独立的一个B-Tree,也有复合索引,全文索引也要分词(一般还是没人用全文索引)。
db.集合名.createIndex( { "字段名1" : 排序⽅式, "字段名2" : 排序⽅式 } )
多了一个地理索引,分平面和球面,可以通过距离查询附件的经纬度。
创建索引,2dsphere是球面,2d是平面。
db.company.ensureIndex( { loc : "2dsphere" } )
创建了地理索引才能使用查询;查找附件50米的点,还是很方便的
db.company.find({
"loc" : {
"$geoWithin" : {
"$center":[[116.482451,39.914176],0.05]
}
}
})
explain 分析,查看查询语句效率
db.集合名.find({key1:value1, key2:value2}).explain("executionStats")
executionTimeMillis执⾏耗时
stage: COLLSCAN/全表扫描,IXSCAN/索引扫描,FETCH/根据索引去检索⽂档、SHARD_MERGE/合并分⽚结果、IDHACK/针对_id进⾏查询
集群,自动主从切换
不需要依赖插件,自己就可以实现主从切换。
使用复制集,还是主从复制的机制(实现一定不一样,4.0后mongodb不支持主从复制);
使用oplog而不是二进制Binlog,有增量复制和全量复制两种情况;所以比MySql先进,MySql不会自动全量复制。
节点间会自动进行选举,不需要自己设定。
但是主节点掉线,再重新上线,还是不会自动加入同步;因为配置文件已经删掉了掉线服务器ip,这点和MySql还是一样的。
整体来说比MySql的主从复制使用起来更方便。
不设置主节点怎么知道哪个节点能做修改操作?
这时候需要一个路由节点,这是一个mongodb集群图;mongodb的分片工作也不需要插件,自己就能完成。

路由配置文件
port=27017
bind_ip=0.0.0.0
fork=true
logpath=route/logs/route.log
configdb=configsvr/127.0.0.1:17017,127.0.0.1:17018,127.0.0.1:17019
配置节点configsvr配置文件
# 数据库⽂件位置
dbpath=config/config1
#⽇志⽂件位置
logpath=config/logs/config1.log
# 以追加⽅式写⼊⽇志
logappend=true
# 是否以守护进程⽅式运⾏
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是⼀个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
分片的配置文件
dbpath=shard/shard1/shard1-37017
bind_ip=0.0.0.0
port=37017
#后台启动,windows无效
fork=true
logpath=shard/shard1/shard1-37017.log
replSet=shard1
shardsvr=true
启动命令
先将所有mongodb启动 mongod -f XXX.conf
配置节点集群
use admin//使用admin数据库
var cfg ={"_id":"configsvr","members":[{"_id":1,"host":"127.0.0.1:17017"},{"_id":2,"host":"127.0.0.1:17018"},{"_id":3,"host":"127.0.0.1:17019"}]};
rs.initiate(cfg)//重新装载配置,并重新⽣成集群节点
配置分片集群,arbiterOnly仲裁节点不参与竞选
var cfg ={"_id":"shard1","protocolVersion" : 1,"members":[{"_id":1,"host":"127.0.0.1:37011"},{"_id":2,"host":"127.0.0.1:37013"},{"_id":3,"host":"127.0.0.1:37015"},{"_id":4,"host":"127.0.0.1:37017","arbiterOnly":true}]};
rs.initiate(cfg)
向路由中添加分片节点
sh.addShard("shard1/127.0.0.1:37011,127.0.0.1:37013,127.0.0.1:37015,127.0.0.1:37017");
sh.addShard("shard2/127.0.0.1:47011,127.0.0.1:47013,127.0.0.1:47015,127.0.0.1:47017");
springboot项目配置文件
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=XXXDB
大功告成!
MongoDB啥时候用?
适合随机查找读写,不适合区间查找读写。说白了就是适合查单个数据。
由于不支持事务,所以重要数据不能交给它。
⼤尺⼨、低价值的数据;
无法确定表字段(我自己用来做自定义表单功能);
请求快照,如果接收方没响应,可以使用快照数据继续重试;
保存经常变化的用户数据,积分,道具,日志等;
地理相关(有天然的地理索引)
网友评论