美文网首页
MongoDB 初接触

MongoDB 初接触

作者: monvhh | 来源:发表于2018-10-19 12:58 被阅读0次

    曾自己借助阿里云和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/

    相关文章

      网友评论

          本文标题:MongoDB 初接触

          本文链接:https://www.haomeiwen.com/subject/zkuyzftx.html