一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富
MongoDB将数据存储为一个文档,数据结构由键值(key-value)对组成,MongoDB文档相似于JSON对象,字段值能够包含其余文档,数组及文档数组
html
点击访问连接git
因为MongoDB数据库在关系型和非关系型数据库之间,其数据库结构相似关系型数据库
github
SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表链接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id字段设置为主键
RDBMS MongoDB 数据库 数据库 表格 集合 行 文档 列 字段 表联合 嵌入文档 主键 主键 (MongoDB 提供了 key 为 _id
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
web
1.mongodb:// 固定格式,必须制定 2.username:password@ 可选,链接到数据库后会参数登陆这个数据库 3.host1 必须指定一个host 4.portx 可选指定端口,不填默认27017 5./database 若是指定username:password@,链接并验证登陆指定数据库,若不指定,默认打开test数据库 6.?options 链接选项,全部链接选项都是键值对name=value,键值对之间经过&或;隔开
mongodb中默认的数据库为test,若是没有建立新的数据库,集合将存放在test数据库中
正则表达式
- use database_name - 若是数据库不存在,则建立数据库,不然切换到指定数据库 - show dbs - 查看全部数据库 - show tables - 查看某数据中的全部集合 - db.数据库名.insert({'key':'value'}) - 刚建立的数据库并不在数据库列表中,插入数据才显示
-db.dropDatabase() - 删除当前数据库,默认为test - db.集合名.drop() - 删除数据库中的集合
- db.createCollection(name,options) 建立 - name:要建立的集合名称 - options:可选参数,指定有关内存大小以及索引 - capped 布尔 - 若是为 true,则建立固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最先的文档。当该值为 true 时,必须指定 size 参数。 - autoindeld 布尔 - 如为 true,自动在 _id 字段建立索引。默认为 false。 - size 数值 - 为固定集合指定一个最大值(字节计) - max 数值 - 指定固定集合包含文档的最大数量 - db.collection.drop() 删除 - 成功删除选定集合,则drop()方法返回true 不然返回false
文档的数据结构和json基本同样 全部存储在集合中的数据都是BSON格式 BSON是一种类json的一种二进制形式的存储格式
-mongodb 使用insert()或save()方法向集合中插入文档 -insert() 当插入数据中 _id在文档中存在则报错 - save() 当插入数据中 _id存在则覆盖原来文档 -db.集合名.insert(document)
-更新文档 db.集合名.update/save() -update( <query>, #查询条件 <update>, #update的对象和一些更新的操做符(如$,$inc)等,也能够理解为sql update查询内set后面 { upsert:<boolean>, #可选 若是不存在update的记录,是否插入objNew,true为插入,默认是false,不插入 multi:<boolean>, #可选 mongodb 默认是false,只更新找到的第一条记录,若是这个参数为true,就把按条件查出来多条记录所有更新。 writeConcern:<document> #可选 抛出异常的级别 } ) - save( document>, #文档数据 { writeConcern: <document> 可选,抛出异常 } ) - 删除文档 db.集合名.remove() 在文档删除前先经过find()命令判断执行条件是否正确 - remove( <query>, #可选 删除文档的条件 <justOne> #可选 若是设为 true 或 1,则只删除一个文档,若是不设置该参数,或使用默认值 false,则删除全部匹配条件的文档。 writeConcern: <document> (可选)抛出异常的级别 )
-find #查询全部 - db.集合名称.find() -findone() #查询第一个 - db.集合名称.findone() -pretty() #将结果格式化 - db.集合名称.find().pretty()
操做 | 格式 | 范例 | RDBMS中的相似语句 |
---|---|---|---|
等于 | {<key>:<value>} |
db.col.find({"by":"菜鸟教程"}).pretty() | where by = '菜鸟教程' |
小于 | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
- and - db.集合名称.find({key1:value1,key2:value2}) - or - db.集合名称.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
-in - db.集合名.find( { $in:[范围值] }
- / / - db.集合名.find( { <key>:/匹配字段/ } )
-使用 // 或 $regex 编写正则表达式 -实例: db.集合名.find({stu:/^abc/}) db.集合名.find({stu:{$regex:"^abc"}}) -db.集合名.find( { <field>:{$regex:"pattern",$options:"<options>"} } ) -options可选项:能够组合使用 -i 忽略大小写 -m 多行匹配模式 -x 忽略非转义的空白字符 -s 单行匹配模式
须要在MongoDB中读取指定数量的数据记录,可使用MongoDB的Limit方法, limit()方法
-limit() - db.集合名.find().limit(number) - 接受一个数字参数,该参数指定从MongoDB中读取的记录条数。 - skip() 默认参数为0 - db.集合名.find().skip(number) - 跳过指定数量的数据,skip方法一样接受一个数字参数做为跳过的记录条数。 -两个方法能够组合使用 - db.集合名.find().skip(num).limit(num) 或 db.集合名.find().limit(num).skip(num)
-sort() #排序 - db.集合名.find().sort({key:1}) - sort() 方法能够经过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式, - 其中 1 为升序排列,而 -1 是用于降序排列。 - count() #统计个数 - db.集合名.find().count() 或 db.集合名.count({条件}) - distinct() #消除重复(对数据去重) - db.集合名.distinct(key,{条件})
-字符的显示 -实例:db.stu.find({age:{$gt:18},{name:1,_id:0}}) - 设置为1显示,_id设置为0不显示
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构sql
-createIndex() #建立索引 - db.集合名.createIndex(keys,options) - Key 值为你要建立的索引字段(一致多个key),1 为指定按升序建立索引,-1 为指定按降序建立索引 - ooptions参数参考地址:http://www.runoob.com/mongodb/mongodb-indexing.html -getIndexts() #查看当前集合全部索引 - db.集合名.getIndexs() - dropIndex() #删除集合指定索引 - db.集合名.dropIndex("索引名") - dropIndexs() #删除集合全部索引 - totalIndexSize() #查看集合索引大小 - db.集合名.totalIndexSize()
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点相似sql语句中的 count(*)。mongodb
- aggregate() - db.集合名称.aggregate(aggregate_opeation)
处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。数据库
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中全部文档对应值得最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中全部文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{$group : | {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不建立副本 | 。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
- 管道在Unix和Linux中通常用于将当前命令的输出结果做为下一个命令的参数。
- MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操做是能够重复的。
经常使用管道 | 做用 |
---|---|
$project | 修改输入文档的结构。能够用来重命名、增长或删除域,也能够用于建立计算结果以及嵌套文档。 |
$match | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操做。 |
$limit | 用来限制MongoDB聚合管道返回的文档数。 |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档。 |
$unwind | 将文档中的某一个数组类型字段拆分红多条,每条包含数组中的一个值。 |
$group | 将集合中的文档分组,可用于统计结果。 |
$sort | 将输入文档排序后输出。 |
$geoNear | 输出接近某一地理位置的有序文档。 |
将集合中的文档分组,可用于统计结果json
- 实例:求学生总人数,平均年龄 db.stu.aggregate( { _id:null, #其分组的依据是 _id:后面的字段 counter:{$sum:1}, avgage:{$avg:'$age'} #须要执行的字段须要添加 $ } )
修改输入文档的结构canvas
-实例:在$group 中的输出结果 存在 _id ,可经过$project修改 db.stu.aggregate( {$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:'$age'}}}, {$project:{gender:'$_id',count:1,avg_age:1,_id:0}} #当_id设置为0 ,其字段隐藏 )
用于过滤数据,只输出符合条件的文档,把结果交给下一管道,find()不能够
-实例:选择年龄大于20的学生,观察男性和女性有多少人 db.stu.aggregate( { $match:{ age:{$gt:20} } }, { $group:{_id:"$gender",count:{$sum:1} } }, { $project:{ _id:0,gender:"$_id",count:1 } } )
将输入文档排序后输出 -实例:查询学生信息,按年龄升序 db.stu.aggregate( { $sort:{age:1} } )
在聚合管道中跳过指定数量的文档,并返回余下的文档
-实例:跳过前两个文档 db.stu.aggreagate( { $limit:2 } )
将文档中的某一个数组类型字段拆分红多条,每条包含数组中的一个值。
-实例1: 添加实验数据:db.t1.insert({_id:1,item:'t-shirt',size:['S','M','L']}) 执行: db.t1.aggregate( {$unwind:'$size'} ) 结果: {"_id":1,"item":"t-shirt","size":"S"}, {"_id":1,"item":"t-shirt","size":"S"}, {"_id":1,"item":"t-shirt","size":"S"} -实例2:保留某字段没有对应拆分的集合,(即保留size为null或为空的文档) db.t1.aggregate( { $unwind:{ path:'$size',preserveNullAandEmptyArrays:true } } )
复制的基本架构:由3台服务器组成,一个三成员的复制集,由三个有数据,或者两个有数据,一个做为仲裁者
高数据量和吞吐量的数据库应用会对单机的性能形成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
解决方案:
垂直扩展:增长更多的CPU和存储资源来扩展容量。 水平扩展:将数据集分布在多个服务器上。水平扩展即分片。
组件 | 说明 |
---|---|
Config Server | 存储集群全部节点、分片数据路由信息。默认须要配置3个Config Server节点。 |
Mongos | 提供对外应用访问,全部操做均经过mongos执行。通常有多个mongos节点。数据迁移和数据自动平衡。 |
Mongod | 存储应用数据记录。通常有多个Mongod节点,达到数据分片目的。 |
1. mongos :数据路由,和客户端打交道的模块。mongos自己没有任何数据,他也不知道该怎么处理这数据,去找config server 2. config server:全部存、取数据的方式,全部shard节点的信息,分片功能的一些配置信息。能够理解为真实数据的元数据。 3. shard:真正的数据存储位置,以chunk为单位存数据。
-mongodump -h dbhost -d dbname -o dbdirectory -h MongoDB所在服务器地址 例如:127.0.0.1:27017 -d 须要备份的数据库实例 例如:test -o 备份的数据存放位置 例如:c:/data/dump -mongorestore -h <hostname><:port> -d dbname <path> -host<:port>,-h <:port> - MongoDB所在服务器地址,默认:localhost:27017 - db,-d: - 须要恢复的数据库实例,例如:test - drop: - 恢复的时候,先删除当前数据,而后恢复备份数据 - <path>: - mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。 - 你不能同时指定 <path> 和 --dir 选项,--dir也能够设置备份目录。 - dir: - 指定备份的目录 - 不能同时指定<path>和 --dir选项