《MongoDB实战》读书笔记

本文是《MongoDB实战》读书笔记,介绍了MongoDB的主要特性,包括数据模型、即时查询、二级索引、复制和数据库扩展。讨论了核心服务器、驱动和工具的使用,并详细阐述了面向文档数据的设计原则和查询与聚合操作。同时,讲解了更新操作、索引理论与查询优化,以及复制与分片的概念,帮助读者深入理解MongoDB在实际应用中的优势和局限。
摘要由CSDN通过智能技术生成

在国庆前后看了《MongoDB实战》,结合上半年工作中的云数据库的工作和自己使用mongo的一些的经验,做一下总结。

本文来自「心谭博客」《基础、编码和优化》《进阶:索引、复制和分片》,更多文章放在了Github仓库欢迎Star

MongoDB特性和介绍

1. 简介

MongoDB的特点:扩展策略、直观的数据模型。在mongodb中,编程语言定义的对象能被“原封不变”地持久化,消除对象结构和程序映射的复杂性。

2. 主要特性

数据模型

关系型与正规化:对于关系型数据库,数据表本质上是扁平的,因此表示多个一对多关系就需要多张表。经常用到的技术是拆表,这种技术是正规化

但对于Mongo来说,文档支持嵌套等多种格式,无需事先定义Schema

即时查询

mysql和mongodb都支持即时查询,不同的是:前者依赖正则化的模型;后者假定查询字段是存储与文档中的。

二级索引

mongodb支持二级索引,是通过b-tree实现的。

复制

通过副本集的拓扑结构来提供复制功能,其目的是:提供数据的冗余

副本集的主节点能接受读写操作,但从节点是只读的。主节点出问题,会自动故障转移,选取一个从节点升级为主节点。

写速度和持久性

写速度:给定时间内,数据库可以处理的插入、更新和删除操作的数量。

持久性:数据库保持上述写操作的结果不改变的,所用的时间长短。

DB领域,写速度和持久性存在一种相反关系。很好理解,例如memcached,直接写入内存,写速度非常快,但同时数据完全易失。

mongodb的写操作,默认是fire-and-forget:通过TCP发送写操作,不要求数据库应答。用户可以开启安全模式,保证写操作正确无误写入db。并且安全模式可以配置,用于阻塞操作

对于高容量、低价值数据(点击流、日志),默认模式更优;对于重要数据,倾向于安全模式。

mongo中,Journaling日志默认开启。所有写操作会被提交到一个只能追加的日志中。以应对故障后的,重启修复服务。

数据库扩展
  • 垂直扩展(向上扩展):升级硬件,来提高单点性能
  • 水平扩展(向外扩展):将数据库分布到多台机器,是基于自动分片。其中,单独的分片由一个副本集组成,至少有2个节点,保证没有单点失败。

3. 核心服务器和工具

核心服务器

通过mongod可以运行核心服务器。数据文件存储在/data/db中。如果下载编译mongo的源代码,需要手动创建/data/db,并且为其分配权限。

其中,mongo的内存管理是由操作系统来处理的。数据文件通过mmap()系统API,映射成系统的虚拟内存。

命令行

是基于JavaScript编写的。所以能看到很多通用的语法,以及输出的格式。

数据库驱动

针对多个语言,都提供了驱动使用。并且风格几乎保持统一的API接口。

命令行工具

安装到MaxOS后,全局会多出以下命令:

  • mongodumpmongorestore:前者用BSON格式,来备份数据库数据。方便后者恢复。
  • mongoexportmongoimport:导入导出JSON、CSV和TSV格式数据。

4. Mongo的场景

适用于事先无法知晓数据结构的数据,或者数据结构经常不确定性较大的数据。

除此之外,还适用于与分析相关的场景。mongo提供一种固定集合,常用于日志,特点是分配的大小固定,类似于循环队列。

5. 局限

由于使用内存映射,32位系统只能对4GB内存寻址。一半内存被os占用,那么只有2GB能用来做映射文件。所以,必须部署在64位操作系统上

程序编写基础

关注微信公众号 「心谭博客」,前往 「xin-tan.com
专注前端与算法的系列干货分享,欢迎关注(¬‿¬)

mongo驱动的find方法,返回的是游标对象,可以理解为迭代器的下标。在NodeJS中,它的名字和类型是Cursor

在Nodejs中,

1. 驱动工作原理

主要有3个功能:

  1. 生成MongoDB对象的ID,它是存储在_id字段中的默认值
  2. 驱动会把特定语言的文档表述,和BSON互换
  3. 使用TCP套接字与数据库通信
对象ID

在自带的交互式命令行中:

> id = ObjectId()
ObjectId("5d9413867cc8dacf9247fe3e")

对于生成的5d9413867cc8dacf9247fe3e:

- 5d941386 ,这4个字节是时间戳,单位秒数
- 7cc8da,机器ID
- cf92,进程ID
- 47fe3e,计数器

2. 安全写入模式(Write Concern)

对所有的写操作(插入、更新或删除)都能开启此模式。以此保证,操作一定在数据库层面生效。

在v4.0中,以insert为例,文档如下:

db.collection.insert(
   <document or array of documents>,
   {
   
     writeConcern: <document>,
     ordered: <boolean>
   }
)

关于 Write Concern的详细参数,可以看这篇文档:https://docs.mongodb.com/manual/reference/write-concern/

其中,重要的是w 参数,它可以指定是否使用应答写入。目前默认是1,应答式写入。设置为0,则是非应答式。

面向文档的数据

1. Schema 设计原则

设计数据库Schema式根据数据库特点和应用程序需求的情况下,为数据集选择最佳表述的过程。

2. 设计电子商务数据模型

一对多:产品和分类

假设一个电商场景,要对一个商品doc进行设计。对于商品,它有多个分类category,因此需要一对多操作,同时,mongo不支持联结操作(join)。

因此解决方案是,在商品的一个字段中,保存分类指针的数组。这里的指针,就是mongo中的对象ID。

下面是一个简单的例子:

> db.products.find()
{ "_id" : ObjectId("5d9423257cc8dacf9247fe41"), "categories" : [ ObjectId("5d9423017cc8dacf9247fe3f") ] }
> db.categories.find({})
{ "_id" : ObjectId("5d9423017cc8dacf9247fe3f"), "name" : "分类1" }
{ "_id" : ObjectId("5d9423037cc8dacf9247fe40"), "name" : "分类2" }
一对多:用户与订单

和前面的关系不同,这里的“多”体现在“订单”上。这里的订单中,保存着指向用户的指针。

评论

每个产品会有多个评论,而每个评论,可能会有点赞人列表。当要展示返回给前端的时候,需要获取产品评论,并且获取点赞人列表。

方案1:点赞人列表,保存着由指针组成的集合。可以先查询产品评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值