🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[info] MongoDB 简介 **为什么学习mongodb:** mongodb在项目中很有用,可用于像商品详情中的数据聚合缓存。BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。 * MongoDB 更类似 MySQL,**支持字段索引、游标操作**,其优势在于**查询功能比较强大**,**擅长查询 JSON 数据**,**能存储海量数据**,**但是不支持事务**。 * MySQL 在大数据量时**效率**显著**下降**,MongoDB 更多时候作为关系数据库的一种替代。 * Redis 是一个**开源**(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、**缓存**和**消息中间件**。它支持**多种类型的数据结构**,如 字符串(strings), 散列(hashes),列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence),并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability) MongoDB 将数据存储为一个**文档**,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 >[info] MongoDB概念解析 ![](https://img.kancloud.cn/32/56/32566086c08f5cca39933cea3bf07879_1007x392.png) #### **1. MongoDB 关键术语** #### **1.1 数据库** 一个mongodb中可以建立多个数据库。 MongoDB的默认数据库为"db",该数据库存储在data目录中。 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。 * **"show dbs"** 命令可以显示所有数据的列表。 * **"db"** 命令可以显示当前数据库对象或集合。 * **"use"** 命令,可以连接到一个指定的数据库。 * 数据库名是有保留。 如下: * **admin**:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。 * **local:** 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合 * **config**: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息 #### **1.2 集合** 集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入**不同格式和类型的数据**,但通常情况下我们插入集合的数据都会有一定的关联性。 #### **1.3 文档(Document)** 文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别, ~~~ {"site":"www.sixstaredu.com", "name":"winner"} ~~~ #### **1.4 元数据** 数据库的信息是存储在集合中。它们使用了系统的命名空间:`dbname.system.*` ![](https://img.kancloud.cn/31/f9/31f9302d97a008e1a3f9616a1e5ba5f3_1001x295.png) #### **1.5 MongoDB 数据类型** ![](https://img.kancloud.cn/d3/4f/d34f0376d7249a24b31310ca506f49b6_1208x840.png) MongoDB 中存储的文档必须有一个 \_id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象 由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间: ~~~ > var newObject = ObjectId() > newObject.getTimestamp() ISODate("2017-11-25T07:21:10Z") ~~~ #### **1.6 连接** 语法: ~~~ mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] ~~~ * **mongodb://** 这是固定的格式,必须要指定。 * **username:password@** 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库 * **host1** 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。 * **portX** 可选的指定端口,如果不填,默认为27017 * **/database** 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。 * **?options** 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开 标准的连接格式包含了多个选项(options): ![](https://img.kancloud.cn/3a/24/3a24d369e28880f008fb6ebf2dcceb14_1009x744.png) 以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。 ~~~ mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000 ~~~ #### **1.7 创建数据库&集合** 1. 如果数据库不存在,则创建数据库,否则切换到指定数据库: ~~~ use DATABASE_NAME ~~~ 2. MongoDB 中使用 **createCollection()** 方法来创建集合: ~~~ db.createCollection(name, options) ~~~ * name: 要创建的集合名称 * options: 可选参数, 指定有关内存大小及索引的选 ![](https://img.kancloud.cn/08/a1/08a1fbd5dc811b34de9751dbd7998fc9_1002x404.png) #### **1.8 删除数据库&集合** 1. 删除数据库: ~~~ db.dropDatabase() -- 删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名 ~~~ 2. 删除集合: ~~~ db.collection.drop() # show collections 命令查看已存在的集合 >show collections mycol mycol2 system.indexes runoob > #删除集合 mycol2 >db.mycol2.drop() true > ~~~ >[info] Redis和MongoDB的区别(面试受用) 之前也用过redis,当时是用来存储一些热数据,量也不大,但是操作很频繁。现在项目中用的是MongoDB,目前是百万级的数据,将来会有千万级、亿级。 就Redis和MongoDB来说,大家一般称之为Redis缓存、MongoDB数据库。这也是有道有理有根据的, Redis主要把数据存储在内存中,其“缓存”的性质远大于其 **“数据存储“** 的性质,其中数据的增删改查也只是像变量操作一样简单; MongoDB却是一个 **“存储数据”** 的系统,增删改查可以添加很多where条件,就像SQL数据库一样灵活,这一点在面试的时候很受用。 ##### **1. 内存管理机制** Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。 MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。 #### **2. 支持的数据结构** Redis 支持的数据结构丰富,包括hash、set、list等。 MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。 #### **3. 数据量和性能** 当物理内存够用的时候,redis>mongodb>mysql 当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。 实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。 但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。 mongodb还是能够保证性能。 #### **4. 性能** mongodb依赖内存,TPS较高;Redis依赖内存,TPS非常高。性能上Redis优于MongoDB。 #### **5. 可靠性** mongodb从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性; Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能。 可靠性上MongoDB优于Redis。 #### **6. 数据分析** mongodb内置数据分析功能(mapreduce);而Redis不支持。 #### **7. 事务** Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;mongodb不支持事务。 #### **8. 集群** MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。