NOSQL-MongoDB简介

    xiaoxiao2021-03-25  95

    MongoDB

    MongoDB 是一个高性能,开源,无模式的文档型数据库,开发语言是C++。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。

    1.特点

    1.1 数据格式

    在 MongoDB 中,文档是对数据的抽象,它的表现形式就是我们常说的 BSON(Binary JSON )。

    BSON 是一个轻量级的二进制数据格式。MongoDB 能够使用 BSON,并将 BSON 作为数据的存储存放在磁盘中。

    BSON 是为效率而设计的,它只需要使用很少的空间,同时其编码和解码都是非常快速的。即使在最坏的情况下,BSON格式也比JSON格式再最好的情况下存储效率高。

    对于前端开发者来说,一个“文档”就相当于一个对象:

    {“name":"mengxiangyue","sex":"nan"}

    对于文档是有一些限制的:有序、区分大小写的,所以下面的两个文档是与上面不同的:

    {”sex“:"nan","name":"mengxiangyue"} {"Name":"mengxiangyue","sex":"nan"}

    另外,对于文档的字段 MongoDB 有如下的限制:

    _id必须存在,如果你插入的文档中没有该字段,那么 MongoDB 会为该文档创建一个ObjectId作为其值。_id的值必须在本集合中是唯一的。

    多个文档则组合为一个“集合”。在 MongoDB 中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的,比如下面的两个文档可以同时存入到一个集合中:

    {"name":"mengxiangyue"} {"Name":"mengxiangyue","sex":"nan"}

    1.2 性能

    MongoDB 目前支持的存储引擎为内存映射引擎。当 MongoDB 启动的时候,会将所有的数据文件映射到内存中,然后操作系统会托管所有的磁盘操作。这种存储引擎有以下几种特点:

    * MongoDB 中关于内存管理的代码非常精简,毕竟相关的工作已经有操作系统进行托管。

    * MongoDB 服务器使用的虚拟内存将非常巨大,并将超过整个数据文件的大小。不用担心,操作系统会去处理这一切。

    在《Mongodb亿级数据量的性能测试》一文中,MongoDB 展现了强劲的大数据处理性能(数据甚至比Redis的漂亮的多)。

    另外,MongoDB 提供了全索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。通常能够极大的提高查询的效率。

     

    1.3 持久化

    MongoDB 在1.8版本之后开始支持 journal,就是我们常说的 redo log,用于故障恢复和持久化。 

    当系统启动时,MongoDB 会将数据文件映射到一块内存区域,称之为Shared view,在不开启 journal 的系统中,数据直接写入shared view,然后返回,系统每60s刷新这块内存到磁盘,这样,如果断电或down机,就会丢失很多内存中未持久化的数据。

    当系统开启了 journal 功能,系统会再映射一块内存区域供 journal 使用,称之为 private view,MongoDB 默认每100ms刷新 privateView 到 journal,也就是说,断电或宕机,有可能丢失这100ms数据,一般都是可以忍受的,如果不能忍受,那就用程序写log吧(但开启journal后使用的虚拟内存是之前的两倍)。

     

    1.4 CAP类别

    MongoDB 比较灵活,可以设置成 strong consistent (CP类型)或者 eventual consistent(AP类型)。

    但其默认是 CP 类型(了解更多)。

    2. Node下的使用

    MongoDB 在 node 环境下的驱动引擎是 node-mongodb-native ,作为依赖封装到 mongodb 包里,我们直接安装即可:

    npm install mongodb

    实例:

    var mongodb = require('mongodb'); var mongodbServer = new mongodb.Server('localhost', 27017, { auto_reconnect: true, poolSize: 10 }); var db = new mongodb.Db('mydb', mongodbServer); /* open db */ db.open(function() { /* Select 'contact' collection */ db.collection('contact', function(err, collection) { /* Insert a data */ collection.insert({ name: 'Fred Chien', email: 'cfsghost@gmail.com', tel: [ '0926xxx5xx', '0912xx11xx' ] }, function(err, data) { if (data) { console.log('Successfully Insert'); } else { console.log('Failed to Insert'); } }); /* Querying */ collection.find({ name: 'Fred Chien' }, function(err, data) { /* Found this People */ if (data) { console.log('Name: ' + data.name + ', email: ' + data.email); } else { console.log('Cannot found'); } }); }); });

    另外我们也可以使用MongoDB的ODM(面向对象数据库管理器) —— mongoose 来做数据库管理,具体参照其API文档。

    3. 优缺点

    优势

    1. 强大的自动化 shading 功能(更多戳这里);

    2. 全索引支持,查询非常高效;

    3. 面向文档(BSON)存储,数据模式简单而强大。

    4. 支持动态查询,查询指令也使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

    5. 支持 javascript 表达式查询,可在服务器端执行任意的 javascript函数。

     

    缺点

    1. 单个文档大小限制为16M,32位系统上,不支持大于2.5G的数据;

    2. 对内存要求比较大,至少要保证热数据(索引,数据及系统其它开销)都能装进内存;

    3. 非事务机制,无法保证事件的原子性。

    转载请注明原文地址: https://ju.6miu.com/read-14751.html

    最新回复(0)