1、简介
MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构很是松散,是相似json的bson格式,所以能够存储比较复杂的数据类型。Mongo最大的特色是它支持的查询语言很是强大,其语法有点相似于面向对象的查询语言,几乎能够实现相似关系数据库单表查询的绝大部分功能,并且还支持对数据创建索引。mysql
2、什么是mongodb
1.mongodb是有C++语言编写,是一个机遇分布式文件存储的开源数据库系统。
2.在高负载的状况下,随时添加更多的节点,能够保证服务器性能。
3.mongodb旨在为WEB应用提供可扩展的高性能数据存储解决方案。
4.mongodb将数据存储为一个文档,数据结构由键值(key=>value)对组成。
5.mongodb文档相似于json对象,字段值能够包含其余文档,数组及文档数组。linux
3、mongodb的优缺点sql
优势:
文档结构的存储方式,可以更便捷的获取数据
内置GridFS,支持大容量存储
海量数据下,性能优越
动态查询
全索引支持,扩展到内部对象和内嵌数组
查询记录分析
快速,就地更新
高效存储二进制大对象(照片,视频等等)
复制(副本集)和支持自动故障恢复
内置Auto-Sharding 自动分片支持云集扩展性,分片简单
MapReduce 支持复杂聚合
缺点:
不支持事务操做
MongoDB 占用空间过大 (不过这个肯定对于目前快速下跌的硬盘价格来讲,也不算什么缺点了)
MongoDB没有如MySQL那样成熟的维护工具
没法进行关联表查询,不适用于关系多的数据
复杂聚合操做经过mapreduce建立,速度慢
模式自由,自由灵活的文件存储格式带来的数据错
MongoDB 在你删除记录后不会在文件系统回收空间。除非你删掉数据库。可是空间没有被浪费mongodb
Ps:
1.GridFS
GridFS是一个出色的分布式文件系统,能够支持海量的数据存储。
内置了GridFS了MongoDB,可以知足对大数据集的快速范围查询。
2.内置Auto-Sharding 自动分片支持云集扩展性,分片简单
提供基于Range的Auto Sharding机制:
一个collection可按照记录的范围,分红若干个段,切分到不一样的Shard上。
Shards能够和复制结合,配合Replica sets可以实现Sharding+fail-over,不一样的Shard之间能够负载均衡。
查询是对客户端是透明的。客户端执行查询,统计,MapReduce等操做,这些会被MongoDB自动路由到后端的数据节点。
这让咱们关注于本身的业务,适当的 时候能够无痛的升级。MongoDB的Sharding设计能力最大可支持约20 petabytes,足以支撑通常应用。
这能够保证MongoDB运行在便宜的PC服务器集群上。PC集群扩充起来很是方便而且成本很低,避免了“sharding”操做的复杂性和成本。
三、海量数据下,性能优越
在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际没法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能一样很使人满意,一样写入百万级别的数 据,mongodb比我之前试用过的couchdb要快得多,基本10分钟如下能够解决。补上一句,观察过程当中mongodb都远算不上是CPU杀手。
四、全索引支持,扩展到内部对象和内嵌数组
索引一般可以极大的提升查询的效率,若是没有索引,MongoDB在读取数据时必须扫描集合中的每一个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是很是低的,特别在处理大量的数据时,查询能够要花费几十秒甚至几分钟,这对网站的性能是很是致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
五、MapReduce 支持复杂聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点相似sql语句中的 count(*)。
与关系型数据库相比,mongodb的缺点:
Mongodb 不支持事物操做:
因此事务要求严格的系统(若是银行系统)确定不能用它。
mongodb不支持事务操做:
因此事务要求严格的系统(若是银行系统)确定不能用它。
mongodb占用空间过大:
关于其缘由,在官方的FAQ中,提到有以下几个方面:
一、空间的预分配:为避免造成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,并且申请的量从64M、128M、256M那 样的指数递增,直到2G为单个文件的最大致积。随着数据量的增长,你能够在其数据目录里看到这些整块生成容量不断递增的文件。
二、字段名所占用的空间:为了保持每一个记录内的结构信息用于查询,mongodb须要把每一个字段的key-value都以BSON的形式存储,若是 value域相对于key域并不大,好比存放数值型的数据,则数据的overhead是最大的。一种减小空间占用的方法是把字段名尽可能取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上做为权衡了。
三、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”便可,之后还能够重复利用。
四、能够按期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢
MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。shell
4、安装部署数据库
(一)yum源方式安装json
一、添加yum源
vim /etc/yum.repos.d/mongodb3.0.repo
[mongodb]
name=mongodb
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/
http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.7/x86_64/
enabled=1
gpgcheck=0vim
二、安装
yum -y install mongodb-org后端
三、安装完的后续调整数组
blockdev --report blockdev --setra 256 /dev/sda blockdev --setra 256 /dev/dm-1
四、WARNING 解决
WARNING: /sys/kernel/mm/transparent_hugepage/enabled?is?'always'.
须要作如下操做
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
打开文件数限制
vim /etc/security/limits.d/20-nproc.conf(不必定是这个名称,能够cd到limits.d目录下查看)
五、 CentOS 7上须要把mongoDB添加到systemd,不然会出现下面的错误
systemd[1]: Failed to start SYSV: Mongo is a scalable, document-oriented database..
将mongodb添加到systemd管理中
vim /usr/lib/systemd/system/mongod.service
[Unit]
Description=mongodb database
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=--quiet -f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS run
PIDFile=/var/run/mongodb/mongod.pid
[Install]
WantedBy=multi-user.target
创建软链接
ln -s /usr/lib/systemd/system/mongod.service /etc/systemd/system/multi-user.target.wants/
从新加载systemctl
systemctl daemon-reload
六、写配置文件
vim mongodb.conf(主上的启动参数文件)
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/db
journal:
enabled: true
processManagement:
net:
port: 27001
security:
authorization: enabled
七、启动
mkdir -p /data/mongodb/logs/
mongod -f mongodb.conf
(二)源码方式安装
一、下载源码包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
二、解压
tar zxf mongodb-linux-x86_64-3.0.6.tgz -C /data/
cd /data &&mv mongodb-linux-x86_64-3.0.6/ mongodb
三、添加环境变量
echo "export PATH=/data/mongodb/bin/:$PATH" >>/etc/profile
soure /etc/profile
四、建立一个默认数据保存目录
mkdir -p /data/db
mkdir -p /data/mongodb/logs/
五、添加一个配置文件
vim /etc/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/db
journal:
enabled: true
processManagement:
net:
port: 27001
security:
authorization: enabled
六、启动
mongod -f mongodb.conf
Ps: Warrning 源码安装WARNING错误是同样的,请按照yum方式处理WARNING问题
5、操做使用
数据库经常使用命令
一、Help查看命令提示
help
db.help();
db.yourColl.help();
db.youColl.find().help();
rs.help();
二、切换/建立数据库
use yourDB; 当建立一个集合(table)的时候会自动建立当前数据库
三、查询全部数据库
show dbs;
四、删除当前使用数据库
db.dropDatabase();
五、从指定主机上克隆数据库
db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库
六、从指定的机器上复制指定数据库数据到某个数据库
db.copyDatabase("mydb", "temp", "127.0.0.1");将本机的mydb的数据复制到temp数据库中
七、修复当前数据库
db.repairDatabase();
八、查看当前使用的数据库
db.getName();
db; db和getName方法是同样的效果,均可以查询当前使用的数据库
九、显示当前db状态
db.stats();
十、当前db版本
db.version();
十一、查看当前db的连接机器地址
db.getMongo();
Collection汇集集合
一、建立一个汇集集合(table)
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});
二、获得指定名称的汇集集合(table)
db.getCollection("account");
三、获得当前db的全部汇集集合
db.getCollectionNames();
四、显示当前db全部汇集索引的状态
db.printCollectionStats();
用户相关
一、添加一个用户
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用户、设置密码、是否只读
二、数据库认证、安全模式
db.auth("userName", "123123");
三、显示当前全部用户
show users;
四、删除用户
db.removeUser("userName");
其余
一、查询以前的错误信息
db.getPrevError();
二、清除错误记录
db.resetError();
查看汇集集合基本信息
一、查看帮助 db.yourColl.help();
二、查询当前集合的数据条数 db.yourColl.count();
三、查看数据空间大小 db.userInfo.dataSize();
四、获得当前汇集集合所在的db db.userInfo.getDB();
五、获得当前汇集的状态 db.userInfo.stats();
六、获得汇集集合总大小 db.userInfo.totalSize();
七、汇集集合储存空间大小 db.userInfo.storageSize();
八、Shard版本信息 db.userInfo.getShardVersion()
九、汇集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users
十、删除当前汇集集合 db.userInfo.drop();
汇集集合查询
一、查询全部记录
db.userInfo.find();
至关于:select* from userInfo;
默认每页显示20条记录,当显示不下的状况下,能够用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
可是你能够设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。
二、查询去掉后的当前汇集集合中的某列的重复数据
db.userInfo.distinct("name");
会过滤掉name中的相同数据
至关于:select distict name from userInfo;
三、查询age = 22的记录
db.userInfo.find({"age": 22});
至关于: select * from userInfo where age = 22;
四、查询age > 22的记录
db.userInfo.find({age: {$gt: 22}});
至关于:select * from userInfo where age >22;
五、查询age < 22的记录
db.userInfo.find({age: {$lt: 22}});
至关于:select * from userInfo where age <22;
六、查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
至关于:select * from userInfo where age >= 25;
七、查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
八、查询age >= 23 而且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
九、查询name中包含 mongo的数据
db.userInfo.find({name: /mongo/});
//至关于%%
select * from userInfo where name like ‘%mongo%’;
十、查询name中以mongo开头的
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;
十一、查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
至关于:select name, age from userInfo;
固然name也能够用true或false,当用ture的状况下河name:1效果同样,若是用false就是排除name,显示name之外的列信息。
十二、查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
至关于:select name, age from userInfo where age >25;
1三、按照年龄排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
1四、查询name = zhangsan, age = 22的数据
db.userInfo.find({name: 'zhangsan', age: 22});
至关于:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;
1五、查询前5条数据
db.userInfo.find().limit(5);
至关于:selecttop 5 * from userInfo;
1六、查询10条之后的数据
db.userInfo.find().skip(10);
至关于:select from userInfo where id not in (
selecttop 10 from userInfo
);
1七、查询在5-10之间的数据
db.userInfo.find().limit(10).skip(5);
可用于分页,limit是pageSize,skip是第几页*pageSize
1八、or与 查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
至关于:select * from userInfo where age = 22 or age = 25;
1九、查询第一条数据
db.userInfo.findOne();
至关于:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
20、查询某个结果集的记录条数
db.userInfo.find({age: {$gte: 25}}).count();
至关于:select count(*) from userInfo where age >= 20;
2一、按照某列进行排序
db.userInfo.find({sex: {$exists: true}}).count();
至关于:select count(sex) from userInfo;
索引
一、建立索引
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1});
二、查询当前汇集集合全部索引
db.userInfo.getIndexes();
三、查看总索引记录大小
db.userInfo.totalIndexSize();
四、读取当前集合的全部index信息
db.users.reIndex();
五、删除指定索引
db.users.dropIndex("name_1");
六、删除全部索引索引
db.users.dropIndexes();
修改、添加、删除集合数据
一、添加
db.users.save({name: ‘zhangsan’, age: 25, sex: true});
添加的数据的数据列,没有固定,根据添加的数据为准
二、修改
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
至关于:update users set name = ‘changeName’ where age = 25;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
至关于:update users set age = age + 50 where name = ‘Lisi’;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
至关于:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;
三、删除
db.users.remove({age: 132});
四、查询修改删除
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
});
db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}},remove: true});update 或 remove 其中一个是必须的参数; 其余参数可选。