MongoDB 初接触

曾自己借助阿里云和hexo搭了个站点,现已废弃,过往写的博客暂挪到此处。


title: MongoDB 初接触
date: 2017-01-22 16:21:56
tags:
- 技术
- TODO
- NoSQL


应工作要求,学习MongoDB,然后需要对结果进行培训验收。本文只针对同事会感兴趣的点。

MongoDB优劣

dynamic schemas 动态模式

怕翻译的不好,摘录部分原文。

meaning that you can create records without first defining the structure, such as the fields or the types of their values. You can change the structure of records (which we call documents) simply by adding new fields or deleting existing ones. This data model give you the ability to represent hierarchical relationships, to store arrays, and other more complex structures easily. 
flexible data model : your database schema can evolve with business requirements

For example, schema changes that took days of weeks in The Weather Channel's MySQL databases could be made in just hours with MongoDB.

我个人简单粗暴的理解,就是没有结构限制,你不用预先定义结构,也可以随时往一个集合(mongoDB中的集合collection即RDBMS中的table)里存取不同结构的数据。
例子中说到对MySQL而言,改变schema需要几天甚至几周,对mongoDB而言只需要几个小时。

high availability and scalability 高可用性(or有效性)、高扩展

MongoDB can also be scaled within and across multiple distributed data centers
As your deployments grow in terms of data volume and throughput, MongoDB scales easily with no downtime, and without changing your application.

随着数据量的增大,MongoDB可以完全没有宕机,无需改变你的应用的扩展

Scalability is not just about speed. It's about 3 different metrics, which often work together:

* Cluster Scale. Distributing the database across 100+ nodes, often in multiple data centers
* Performance Scale. Sustaining 100,000+ database read and writes per second while maintaining strict latency SLAs
* Data Scale. Storing 1 billion+ documents in the database

如何实现需进一步学习。

out-of-the-box replication 随手可用的复制功能

详情参考

https://docs.mongodb.com/manual/replication/

Replica sets provide redundancy and high availability, and are the basis for all production deployments.
这个特性实现了冗余和高可用性。

auto-sharding(自动分区) 或者说 分布式系统

分布式计算的优点

  1. 可靠性(容错) :
    分布式计算系统中的一个重要的优点是可靠性。一台服务器的系统崩溃并不影响到其余的服务器。

  2. 可扩展性:
    在分布式计算系统可以根据需要增加更多的机器。

  3. 资源共享:
    共享数据是必不可少的应用,如银行,预订系统。

  4. 灵活性:
    由于该系统是非常灵活的,它很容易安装,实施和调试新的服务。

  5. 更快的速度:
    分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度。

  6. 开放系统:
    由于它是开放的系统,本地或者远程都可以访问到该服务。

  7. 更高的性能:
    相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)。

分布式计算的缺点

  1. 故障排除:
    故障排除和诊断问题。

  2. 软件:
    更少的软件支持是分布式计算系统的主要缺点。

  3. 网络:
    网络基础设施的问题,包括:传输问题,高负载,信息丢失等。

  4. 安全性:
    开发系统的特性让分布式计算系统存在着数据的安全性和共享的风险等问题。

分区详情参考:https://docs.mongodb.com/manual/sharding/

查询速度快

我理解的原因之一是,文档存储方式。比如跟一个用户相关的东西,存储在一个集合(SQL中的表)中,所以相对SQL的多表联合查询,要快。但有冗余的问题。
比如产品评论,在产品集合中存了一遍,在用户集合中也存了一遍。

肯定还有其他的原因,需进一步学习。

参考文档:

http://www.cnblogs.com/crazylights/archive/2013/05/08/3066056.html

劣势:不支持复杂的事务

MongoDB不支持事务,但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。

劣势(uncertain):MongoDB为了性能更快,所以数据会有冗余

文档存储方式的可能的劣势。

what's more

http://www.runoob.com/mongodb/nosql.html

MongoDB适用场景,与MySQL对比之下

MongoDB适用

The most common use cases for MongoDB include Single View, Internet of Things, Mobile, Real-Time Analytics, Personalization, Catalog, and [Content Management](Content Management).

MySQL适用

Applications that require complex, multi-row transactions (e.g., a double-entry bookkeeping system)
比如booking system。这种需要强事务性的,需要复杂事务的。

MongoDB 和mySQL一起使用的情况

比如电商系统中的产品 详情,分类,属性等等,而checkout system(我理解的就是购买和支付等行为)用MySQL

详情参考:https://www.mongodb.com/compare/mongodb-mysql

MongoDB结合nodejs的实现

MongoDB Server的安装运行

  1. 安装

  2. 运行MongoDB服务

    mongod

  3. 打开MongoDB后台管理shell

    mongo

    用shell操作数据库的方式,如若用代码操作数据库则不用打开shell

    一些常用指令

    //列出所有db
    show dbs
    //列出当前db
    db
    //使用某db
    use test
    //列出当前db下所有collection
    show collections
    //显示当前collection中的数据
    db.collection_name.find().pretty()
    //针对特殊的collection名
    db[collection_name].find()
    db.getCollection(collection_name).find()
    //pretty()用于格式化
    //清空collection中的数据,移除整个collection
    db.collection_name.drop()
    //插入数据
    db.collection.insert()
    //Shell help
    help
    //命令行help
    mongo —help
    //db help
    db.help()
    //collection help
    db.collection.help()
    
    
  1. 可以启动MongoDB web用户界面

    mongod --dbpath=/data/db --rest

    默认端口28017: http://localhost:28017/

    不过需要关闭2运行的服务。可能是同一个实例 mongod instance。

如果以上命令不能直接执行,需要进入mongodb安装目录的bin目录下。取决于安装方式,如果用brew安装的就不需要进入bin目录

使用mongo-native(官方驱动)实现nodejs的增(删改查类似就未尝试)

  1. 安装

    npm install mongodb

    https://docs.mongodb.com/getting-started/node/client/
    https://github.com/mongodb/node-mongodb-native?jmp=docs

  2. 代码

    var model = {
        uid: json.u,
        ……
    }
    
    var insertDocuments = function (db, callback) {
        // Get the documents collection
        var collection = db.collection('ma_pv');
        // Insert some documents
        collection.insert(model, function (err, result) {
            assert.equal(err, null);
            console.log("Inserted documents into the collection");
            callback(result);
        });
    }
    
    var MongoClient = require('mongodb').MongoClient, assert = require('assert');
    
    // Connection URL
    var url = 'mongodb://localhost:27017/ma';
    
    // Use connect method to connect to the server
    MongoClient.connect(url, function (err, db) {
        assert.equal(null, err);
        console.log("Connected successfully to server");
    
        insertDocuments(db, function () {
            db.close();
        });
    });
    

使用mongoose(ORM)实现nodejs增

  1. 安装

    npm install mongoose

  2. 代码

    连接数据库

    var mongoose = require('mongoose');
    mongoose.Promise = global.Promise
    mongoose.connect('mongodb://localhost:27017/ma');//;连接数据库
    
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function() {
        console.log("we're connected!");
    });
    
    
    module.exports = db;
    

    定义model

    var mongoose = require('mongoose');
    var db = require('./db');
    
    var maPV_schema = mongoose.Schema({
        uid: String,
        ……
        create_time: Date
    }); //  定义了一个新的模型,但是此模式还未和maPV_schema集合有关联
    
    var maPV = mongoose.model('maPV', maPV_schema); //  与maPV_schema集合关联
    
    
    module.exports = maPV;
    

    数据增

    var PVmodel = require("../model_mongoose/ma_pv");
    var pvData = new PVmodel({
        uid: json.u,
        ……
    });
    
    
    pvData.save(function (err,pv,num) {
        if (err) {
            console.error(err)
        }
        // throw err;
    
        console.log('pvData saved successfully!');
    });
    
  3. what's more

    https://scotch.io/tutorials/using-mongoosejs-in-node-js-and-mongodb-applications

分析

With Mongoose, everything is derived from a Schema.

mongoDB是动态schema的,基本就没有schema,无论什么结构的数据都可以往一个集合(collection,相当于RDBMS的table)中存。
但是mongoose确是先设定schema,但是后续可以通过mongoose的方法随时更改schema。

遇到的问题

报错:

(node:21132) DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead:

bugid:
https://github.com/Automattic/mongoose/issues/4291

临时解决方案:
在collect数据库之前 mongoose.Promise = global.Promise

http://stackoverflow.com/questions/38138445/node3341-deprecationwarning-mongoose-mpromise

MongoDB -> MySQL

首先,为什么要从MongoDB转移至MySQL?
个人考虑,三种情况:

  1. 通过定时服务,分析MongoDB中的一些数据,存储到MySQL中。这样的话,不需要解决什么技术问题,写API而已,API取数据通过MongoDB的驱动连接MongoDB数据库,存数据通过MySQL的驱动连接MySQl。

  2. 如果是把数据直接迁移至MySQL,就只是数据库之间的迁移。但是是否有必要?为什么不直接存储到MySQL

  3. 如果是为了实时分析数据所以需要迁移至MySQL,MongoDB也支持。

    https://www.mongodb.com/collateral/apache-spark-and-mongodb-turning-analytics-into-real-time-action

所以需要细细考虑,结论如下:

  1. 只用MongoDB实现:MongoDB好像可以解决所有问题。
  2. 部分MongoDB部分MySQL,不涉及迁移问题:根据业务不同使用不同sql。
  3. 迁移MySQL。

阿里云MongoDB

除了安装需要按照他们的要求,其他看起来没什么区别;
因为没有环境,所以没办法测试。需要阿里云ECS

ELSE

  1. 架构

    https://www.mongodb.com/collateral/mongodb-architecture-guide

  2. MongoDB实时分析

    https://www.mongodb.com/collateral/apache-spark-and-mongodb-turning-analytics-into-real-time-action

  3. MongoDB结合BI

    https://docs.mongodb.com/bi-connector/master/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 叶小曼bl阅读 112评论 0 2
  • 天有多高,话有多骚!大家好!我是骚老师,欢迎来到咱们的【骚话】。 这几期一直都在说内向者的沟通,之前说了很多都是了...
    培训爱好者阅读 349评论 0 1
  • 用复古华丽风情的配饰 点燃出属于你的光芒http://www.szsjzb.com/
    世家珠宝小客服阅读 173评论 0 0
  • 被风沙抛弃的 将被大海救赎 陨石呼啸着毁灭所有 之后 尘埃落定 之后 我将独自坐在废墟上 看日出 再过三万九千年 ...
    吴宇良阅读 172评论 0 1
  • 几乎每个星期一我们公司都会组织学习六项精进分享会,本周公司特别邀请了中兴精密的王总来给我们分享他们幸福企业的历程,...
    苏雪凤阅读 231评论 0 1