MongoDB 权威指南 -- 读书笔记

MongoDB简介

  • MongoDB 是一个面向文档的数据库。
  • MongoDB的设计采用横向扩展。面向文档的数据模型使它更容易的在多台服务器之间进行数据分割。
  • MongoDB 能自动处理跨集群的数据和负载,自动重新分配文档,及将用户请求路由到正确的机器上。如果一个集群需要更大的容量,只需要想集群添加新服务器,MongoDB就会自动将现有数据想新服务器传送
  • MongoDB能对文档进行动态填充,也能预分配数据文件以利用额外的空间来换取稳定的性能。
  • MongoDB 把尽可能多的内存用作缓存,试图为每次查询自动选择正确的索引

MongoDB 基础知识

  • 文档:文档是mongodb的核心概念。文档就是键值对的一个有序集。
    1. 建不能含有\0(空字符串)。 这个字符用于表示键的结果
    2. '.' 和 '$' 具有特殊意义,只能在特定环境使用,通常这两个字符是被保留的。
  • 集合:就是一组文档,一个集合就相当于一张表
    1. 子集合:使用 '.' 分割不同命名空间的子集合。GridFs(一种用于存储大文件的协议) 使用子集合来存储文件元数据。
  • 数据库:多个集合组成数据库,在磁盘上不同数据库放置在不同文件中。数据库名为文件名,特殊语义数据库:
    1. admin 从身份验证角度这是root 数据库,一些特定的服务器命令只能从admin数据库运行,
    2. local 一台服务器上所以的本地集合都可以存储在这个数据库中
    3. config 分片设置,分片信息会存在这个数据库中
  • MongoDB shell
    1. 自动JavaScript shell
      2.insert 函数将一个文档添加到集合中
    2. find 函数用于查询集合里的文档,自动显示做多20个匹配文档,若只想查询一个文档,可用findOne
    3. update 函数用于更新文档,至少接受两个参数,第一个是限定条件(用于匹配待更新文档),第二个是更新文档
    4. remove 函数用于将文档从数据库中永久删除
  • 数据类型 类似于json
    1. null 用于表示空值活着不存在的字段
    2. 布尔值 true/false
    3. 数值 默认使用64位浮点数值 NumberInt类(表示4字节带符号整数) NumberLong类(表示8字符带符号整数)
    4. 字符串 UTF-8 字符串
    5. 日期被存储为自新纪元以来经过的毫秒数,不存储时区,创建日期对象时使用 new Date(...)
    6. 正则表达式 使用正则表达式作为限定条件,语法也与JavaScript的正则表达式语法相同
    7. 数组 数据列表或数据集可以表示数组
    8. 内嵌文档 文档可嵌套其他文档
    9. 对象ID 是一个12字节的ID,是文档的唯一标识
    10. 二进制数据 是一个任意字节的字符串
    11. 代码 任意JavaScript代码
  • mongodb 中存储的文档必须有一个 "_id" 键。这键值可以是任何类型的,默认是个ObjectId对象。ObjectId使用12字节的存储空间。ObjectId的前4个字节是从标准纪元开始的时间戳,单位为秒。 接下来3个字节是所以主机的唯一标识。通常为主机名的散列值(hash),确保不同主机生成不用的ObjectId。再两位为产生ObjectId的进程的进程标识符(PID),前9个字节保证同一秒钟不同进程产生ObjectId是唯一的。最后三个字节是一个自动增加的计数器。一秒钟最多允许每个进程用拥有256^3(16777216)个不同的ObjectId。如果插入文档时没有"_id"键,系统会自动创建一个,通常会在客户端有驱动程序完成,能交给客户端驱动程序做就不要交给服务器做

创建、更新和删除文档

  • insert 方法向目标集合插入一个文档
  • batchInsert 函数实现批量插入,接受一个文档数组作为参数
  • 所有文档都必须小于16MB
  • remove 删除文档,接受一个查询文档作为可选参数
  • update 更新文档 两个参数(查询文档,修改器文档)
    1. $set 用来指定一个字段的值。如果这个字段不存在,则创建它。可以修改值的类型。可以修改内嵌文档。
    2. $inc 修改器用来增加已有键的值,或者该键不存在那就创建一个。只能用于整形,长整形或双精度浮点型的值。
    3. $push 向已有的数组末尾加入一个元素,要是没有就创建一个新数组。
    4. $addToSet 数组中插入值,将数组看做集合可以避免重复插入。
    5. pop 可以从数组任何一端删除元素 {"pop":{"key":1}} 从数组末尾删除一个元素;{"$pop":{"key":1}} 从头部删除
    6. $pull 将所有匹配的文档删除,而不是删除一个。
    7. 定位操作符,用来定位查询文档中已经匹配的数组元素,并进行更新。update({"comment.author":"john"},{"set":{"comment.$.author":"jim"}}) 只更新第一个匹配的元素。
  • upsert 没有找到合适更新条件的文档,就会以这个条件和更新文档为基本创建一个新的文档。
  • 更新多个文档,默认update更新只能对符合匹配条件到的第一个文档执行操作。要更新所有匹配的文档,可以将update的第4个参数设置为true
  • 写入安全机制是一种客户端设置,用于控制写入的安全级别。
    1. 应答式写入:数据库会给出相应,告知是否成功
    2. 非应答式写入:不返回任何相应,无法知道是否成功

查询

  • find来进行查询,查询返回一个集合中文档的子集
  • 通过find的第二个参数来指定想要的键。
  • 操作符 lt (小于) ;lte (小于等于) ; gt (大于) ;gte (大于等于) ; $ne (不等于)
  • $in 可以用来查询一个键的多个值
  • $or 可以在多个键中查询任意的给定值
  • $nin 将返回与数组中所有条件不匹配的文档
  • $not 是元条件句,可以用在任何其他条件之上
  • $exists 判断定键值已存在
  • $all 查询数组,通过多个元素来匹配数组
  • size 查询特定长度的数组 {size:3}
  • slice 返回某个键匹配的数组元素的一个子集 {slice:10} {slice:-10} {slice:[23,10]}
  • where 子句中查询中执行任意的JavaScript,为了安全起见,应该禁止终端用户使用任意的where 语句
  • $limit 返回限制数量结果
  • $skip 略过参数匹配的文档,然后返回余下的文档,尽量避免使用skip,skip数量非常多的话,skip就会变得很慢。
  • $sort 接受一个对象作为参数,这个对象是一组键/值对,键对应文档的键名,值代表排序的方向。排序方向可以是1(升序)或者-1(降序)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352