博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mongodb 入门学习笔记
阅读量:4096 次
发布时间:2019-05-25

本文共 7479 字,大约阅读时间需要 24 分钟。

  • NoSql简介
    • Not only sql,非关系型数据库,用于超大规模的数据存储
      • 优点
        • 高可扩展性
        • 分布式计算
        • 低成本
        • 架构的灵活性,半结构化数据
        • 没有复杂的关系
      • 缺点
        • 没有标准化
        • 有限的查询功能
        • 最终一致不是直观的程序
    • 关系型数据库的ACID
    • 分布式系统
      • 优点
      • 缺点
    • CAP定理
      • 一个分布式系统不可能同时满足以下三个特点
      • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
      • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
      • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
    • BASE理论
      • 对可用性及一致性的弱要求原则
      • Basically Available 基本可用
      • Soft-state 软状态 无连接的(分布式不同节点副本的同步延时)
      • Eventually Consistent 最终一致性
  • Mongodb简介
    • 面向文档存储
    • JSON
  • 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
      • 高性能
      • 自动维护对象插入顺序
      • 存储空间是提前分配的
  • 元数据
    • 数据库的信息存储在
      • dbname.system.*
  • 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.coll_name.drop()
    • 查看集合
      • show collections
    • 删除数据库
      • db.dropDatabase()
    • 插入文档
      • 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
        • 大于
          • $gt
        • 小于
          • $lt
        • 大于等于
          • $gte
        • 小于等于
          • $lte
      • 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:用于过滤数据,只输出符合条件的文档。 matchmatch使用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})
    • 注意以下不能使用覆盖索引
      • 所有索引字段是一个子文档
      • 所有索引字段是一个数组
    • 查询索引
      • db.users.getIndexes()
  • 查询分析
    • 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() 获取文档创建时间
    • 转字符串
      • new ObjectId().str
  • 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”)
  • 正则表达式
    • $regex
  • 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/

你可能感兴趣的文章
jQuery Validate自定义错误信息,自定义方法
查看>>
腾讯云服务器SMTP ERROR: Failed to connect to server
查看>>
Ubuntu完全删除nginx
查看>>
MySql.Data.MySqlClient.MySqlException: Parameter ‘@maxid’ must be defined
查看>>
phpstorm设置背景图片
查看>>
Web前端-Vue.js必备框架(四)
查看>>
【NOIP2014】飞扬的小鸟
查看>>
IOS NSOperationQueue(线程 封装操作)
查看>>
Oracle 密码文件
查看>>
PHP基础知识
查看>>
数据库时间小技巧 - 取数据库中时间格式是12小时制的时间,如何显示成24小时制...
查看>>
Ubuntu14.04下安装docker
查看>>
PostgreSQl中 index scan 代价的进一步学习
查看>>
PLSQL中隐式打开cursor的小例子
查看>>
GNU make manual 翻译( 一百三十二)
查看>>
Openjudge jubeeeeeat
查看>>
bzoj 1208: [HNOI2004]宠物收养所
查看>>
洛谷 P3586 [POI2015]LOG
查看>>
noip2015 信息传递 强连通块
查看>>
对象交互
查看>>