本文共 7479 字,大约阅读时间需要 24 分钟。
- NoSql简介
- Not only sql,非关系型数据库,用于超大规模的数据存储
- 优点
- 高可扩展性
- 分布式计算
- 低成本
- 架构的灵活性,半结构化数据
- 没有复杂的关系
- 缺点
- 没有标准化
- 有限的查询功能
- 最终一致不是直观的程序
- 关系型数据库的ACID
- 分布式系统
- CAP定理
- 一个分布式系统不可能同时满足以下三个特点
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
- BASE理论
- 对可用性及一致性的弱要求原则
- Basically Available 基本可用
- Soft-state 软状态 无连接的(分布式不同节点副本的同步延时)
- Eventually Consistent 最终一致性
- Mongodb简介
- Mongodb概念解析
sql术语 | monogdb术语 | 解释 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | docunment | 数据库行/文档 |
column | filed | 列/字段 |
index | index | 索引 |
table joins | | 数据库表连接 |
primary key | primary key | 自增主键 |
- 数据库
- show dbs #查看所有数据库
- use test #切换到test数据库
- 特殊数据库
- admin
- 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- config
- 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
- local
- 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- 文档
- key-value键值对
- 例如 {“site”:“”, “name”:“菜鸟教程”}
- 集合
- 文档组
- capped collections 固定大小的collection
- 高性能
- 自动维护对象插入顺序
- 存储空间是提前分配的
- 元数据
- Mongodb数据类型
- String
- Integer
- Boolean
- Double
- Min/Max keys 将值与BSON的最高低值进行比较
- Arrays
- TimeStamp 时间戳。记录文档修改或添加的具体时间
- Object 用于内嵌文档
- Null
- Symbol 符号
- Date
- Object ID 对象Id 用于创建文档的ID
- Binary Data
- Code 代码类型
- Regular expression 用于存储正则表达式
- 操作数据库
- 删除集合
- 查看集合
- 删除数据库
- 插入文档
- db.COLLECTION_NAME.insert(document)
- db.col.save(document) 也可以用于更新
- document=({title: ‘MongoDB 教程’, description: ‘MongoDB 是一个 Nosql 数据库’, by: ‘Mongodb中文网’, url: ‘’, tags: [‘mongodb’, ‘database’, ‘NoSQL’], likes: 100 });
- 更新文档
- 更新已存在的文档
- db.collection.update( query, update, { upsert: , multi: , writeConcern: })
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
- $gt 大于
- $lt 小于
- 删除文档
- db.collectionName.remove(
- query, { justOne: , writeConcern: })
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别
- MongoDB 查询文档
- db.col.find()
- db.col.find().pretty() #易读
- Mongodb与RDBMS比较
- 等于
- db.col.find({“by”:“菜鸟教程”}).pretty()
- where by = ‘菜鸟教程’
- 不等于
- db.col.find({“likes”:{$ne:50}}).pretty()
- where likes != 50
- 大于
- 小于
- 大于等于
- 小于等于
- AND
- find()内传入多个key ,逗号隔开
- db.col.find({key1:value1, key2:value2}).pretty()
- OR
- $or
- db.col.find({$or: [{key1: value1}, {key2:value2}]}).pretty()
- AND OR 联合使用
- db.col.find({“likes”: {$gt:50}, $or: [{“by”: “Mongodb中文网”},{“title”: “MongoDB 教程”}]}).pretty()
- $type 操作符
- 于BSON类型来检索集合中匹配的数据类型,并返回结果
- db.col.find({“title” : {$type : 2}})
- Limit与Skip方法
- db.COLLECTION_NAME.find().limit(NUMBER)
- db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER) #跳过指定数量的数据
- 排序
- db.COLLECTION_NAME.find().sort({KEY:1}) # 1升序 -1降序
- 如果没有指定sort()方法的排序方式,默认按照文档的升序排列
- 索引
- 索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
- 创建索引
- ensureIndex()
- db.col.ensureIndex({“title”:1}) # 1升序 -1降序
- 聚合
- Mongodb聚合
- 用于处理数据并返回结果
- db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
- 例子 db.mycol.aggregate([{ KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {$sum : 1}}}])
- 管道
- linux中 一般用于将当前命令的输出结果作为下一个命令的参数
- MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的
- 表达式
- 常见操作
- $project: 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档
- m a t c h : 用 于 过 滤 数 据 , 只 输 出 符 合 条 件 的 文 档 。 match:用于过滤数据,只输出符合条件的文档。 match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
- db.articles.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- db.article.aggregate({ $skip : 5 });
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档
- Mongodb复制 副本集
- 将数据同步到多个服务器的过程
- 什么是复制
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
- 原理
- 一主一从、一主多从
- 主节点记录在其上的所有操作 oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致
- 副本集特征
- N个点的集群
- 任何节点可作为主节点
- 所有写入都在主节点
- 自动故障转移
- 自动恢复
- 实践
- MongoDB 分片
- 在多台机器上分割数据,使得数据库系统能存储和处理更多的数据
- 原因
- 复制所有的写入操作到主节点
- 延迟的敏感数据会在主节点查询
- 单个副本集限制在12个节点
- 当请求量巨大时会出现内存不足
- 本地磁盘不足
- 垂直扩展价格昂贵
- 组件
- Shard
- 用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
- Config Server
- mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息
- Query Routers
- 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用
- 数据备份
- mongodump -h dbhost -d dbname -o dbdirectory
- 数据恢复
- mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
- 监控
- mongostat,当前运行状态
- mongotop,查看读写花费的时间
- mongotop 10 10秒钟读取一次
- –locks 报告每个数据库的锁的使用中 3.0后已取消
- MongoDB 关系
- 1:1
- 1:N
- N:1
- N:N
- 嵌入式关系
- { “_id”:ObjectId(“52ffc33cd85242f436000001”), “contact”: “987654321”, “dob”: “01-01-1991”, “name”: “Tom Benzamin”, “address”: [ { “building”: “22 A, Indiana Apt”, “pincode”: 123456, “city”: “Los Angeles”, “state”: “California” }, { “building”: “170 A, Acropolis Apt”, “pincode”: 456789, “city”: “Chicago”, “state”: “Illinois” }] }
- 引用式关系
- { “_id”:ObjectId(“52ffc33cd85242f436000001”), “contact”: “987654321”, “dob”: “01-01-1991”, “name”: “Tom Benzamin”, “address_ids”: [ ObjectId(“52ffc4a5d85242602e000000”), ObjectId(“52ffc4a5d85242602e000001”) ] }
- 数据库引用
- 手动引用
- DBRefs
- 一个文档从多个集合引用文档,我们应该使用 DBRefs
- { $ref(集合名称) : , $id(引用的ID) : , $db(数据库的名称) : }
- 覆盖索引查询
- 所有的查询字段是索引的一部分
- 所有的查询返回字段在同一个索引中
- 例子
- db.users.insert({“contact”: “987654321”, “dob”: “01-01-1991”, “gender”: “M”, “name”: “Tom Benzamin”, “user_name”: “tombenzamin”})
- db.users.ensureIndex({gender:1,user_name:1}) //createIndex()
- //覆盖 db.users.find({gender:“M”},{user_name:1,_id:0})
- //不覆盖 db.users.find({gender:“M”},{user_name:1})
- 注意以下不能使用覆盖索引
- 查询索引
- 查询分析
- explain()
- indexOnly true表示使用了索引
- cursor
- hint()
- 原子操作
- mongodb不支持事务,要么保存要么不保存不会出现不完整的情况。
- db.collection.findAndModify()
- $set
- $unset
- $inc
- $push
- $pushAll
- $pull
- $addToSet
- $pop
- $rename
- $bit
- 高级索引
- 索引数组字段
- db.users.ensureIndex({“tags”:1})
- 索引子文档字段
- db.users.ensureIndex({“address.city”:1,“address.state”:1,“address.pincode”:1})
- 索引限制
- 额外开销
- 内存使用
- 查询限制
- 索引键限制
- 插入文档超过索引键限制
- 最大范围
- 集合中索引不能超过64个
- 索引名的长度不能超过125个字符
- 一个复合索引最多可以有31个字段
- ObjectId
- 一个12字节 BSON 类型数据结构
- 前4个字节表示时间戳
- 接下来的3个字节是机器标识码
- 紧接的两个字节由进程id组成(PID)
- 最后三个字节是随机数
- 创建新的id
- newObjectId = ObjectId()
- ObjectId(“5be3e06a0d79133288002c7c”).getTimestamp() 获取文档创建时间
- 转字符串
- Map Reduce
-
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)
``` db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ) ```
- 全文检索
- 对每一个词建立索引
- v2.6以后默认开启
- db.p.ensureIndex({post_text: “text”})
- db.p.find({ KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{ search:“”}})
- 删除
- db.p.dropIndex(“post_text_text”)
- 正则表达式
- GridFS
- 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等
- mongofiles.exe -d gridfs put song.mp3
- db.fs.files.find() 查找文档
- db.fs.chunks.find({files_id:ObjectId(‘534a811bf8b4aa4d33fdf94d’)}) 根据文档id查找chunks
- 固定集合 Capped Collections
- db.createCollection(“cappedLogCollection”,{capped:true,size:10000})
- db.cappedLogCollection.isCapped() 判断是否固定
- db.runCommand({“convertToCapped”:“posts”,size:10000}) 已存在post集合转为固定集合
- db.createCollection(“cappedLogCollection”,{capped:true,size:10000}) 创建固定集合
- 查询安装插入顺序返回
- 特点
- 在32位机子上一个cappped collection的最大值约为482.5M,64位上只受系统文件大小的限制
- 对固定集合进行插入速度极快
- 按照插入顺序的查询输出速度极快
- 能够在插入最新数据时,淘汰最早的数据
- 用途
- MongoDB 自动增长
- db.user.save({ uid: db.ids .findAndModify({ update:{$inc:{‘id’:1}}, query:{“name”:“user”}, new:true}).id, "user"文档的id值加1并返回充当自增id username: “dotcoo”, password:“dotcoo”, info:" "});
- 本文所有笔记均来自于
转载地址:http://jhiii.baihongyu.com/