MongoDB初接触

9198 ワード

自分でアリ雲とhexoを借りてサイトを作ったが、廃棄され、過去に書いたブログはしばらくここに移った.
title:MongoDB初接触date:2017-01-22 16:21:56 tags:-テクノロジー-TODO-NoSQL
仕事の要求に応じて、MongoDBを勉強して、それから結果に対して訓練の検収を行う必要があります.本文は同僚が興味を持つ点だけを対象にしている.

MongoDBの優劣


dynamicschemasダイナミックモード


翻訳の不備を恐れて、一部の原文を抜粋する.
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.

私個人の簡単で乱暴な理解は、構造の制限がなく、事前に構造を定義する必要がなく、いつでも1つの集合(mongodyの集合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. この特性は冗長性と高可用性を実現した.

Autosharding(自動パーティション化)または分散システム


分散計算の利点
  • 信頼性(フォールトトレランス):分散計算システムにおける重要な利点の一つは信頼性である.1台のサーバのシステムクラッシュは、残りのサーバには影響しません.
  • 拡張性:分散コンピューティングシステムでは、必要に応じてより多くのマシンを追加できます.
  • リソース共有:共有データは、銀行、サブスクリプションシステムなどのアプリケーションに不可欠です.
  • 柔軟性:このシステムは非常に柔軟であるため、新しいサービスのインストール、実装、デバッグが容易です.
  • より高速:分散コンピューティングシステムは、他のシステムよりも高速な処理速度をもたらすように、複数のコンピュータの計算能力を有することができる.
  • オープン・システム:オープン・システムであるため、ローカルまたはリモートでサービスにアクセスできます.
  • より高いパフォーマンス:集中型コンピュータネットワーククラスタに比べて、より高いパフォーマンス(およびより良い価格比)を提供できます.

  • 分散計算の欠点
  • トラブルシューティング:トラブルシューティングとトラブルシューティングの問題.
  • ソフトウェア:より少ないソフトウェアサポートは、分散コンピューティングシステムの主な欠点です.
  • ネットワーク:伝送問題、高負荷、情報損失など、ネットワークインフラストラクチャの問題.
  • セキュリティ:システムの特性を開発し、分散コンピューティングシステムにデータのセキュリティと共有のリスクなどの問題がある.

  • パーティションの詳細:https://docs.mongodb.com/manual/sharding/

    クエリ速度が速い


    私が理解している理由の1つは、ドキュメントの格納方法です.例えば、あるユーザーに関連するものは、1つの集合(SQLのテーブル)に格納されるので、SQLのマルチテーブル連合クエリーに対して、速くします.しかし、冗長性の問題があります.たとえば、製品コメントは、製品セットに1回保存され、ユーザーセットにも1回保存されます.
    他にも理由があるに違いない.もっと勉強しなければならない.
    参照ドキュメント:
    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サーバのインストール実行

  • 取付
  • MongoDBサービスmongod
  • を実行する
  • 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()
    
    
  • MongoDB Webユーザーインタフェースmongod --dbpath=/data/db --restデフォルトポート28017を起動できます.http://localhost:28017/
    ただし、2実行のサービスを閉じる必要があります.同じインスタンスmongod instanceかもしれません.

  • 以上のコマンドが直接実行できない場合は、mongodbインストールディレクトリのbinディレクトリの下に入る必要があります.インストール方法によってはbrewでインストールした場合binディレクトリに入る必要はありません

    mongo-native(公式駆動)を用いてnodejsの増加を実現する(削除類似は試みていない)

  • 取付npm install mongodbhttps://docs.mongodb.com/getting-started/node/client/https://github.com/mongodb/node-mongodb-native?jmp=docs
  • コード
    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();
        });
    });
    
  • mongose(ORM)によるnodejs増加

  • 取付npm install mongoose
  • コード接続データベース
    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!');
    });
    
  • 増加
  • what's more
    https://scotch.io/tutorials/using-mongoosejs-in-node-js-and-mongodb-applications

  • ぶんせき


    With Mongoose, everything is derived from a Schema.
    mongodyは動的schemaであり,schemaはほとんどなく,どの構造のデータも一つの集合(collection,RDBMSに相当するtable)に格納できる.しかしmongoseは確かにschemaを先に設定しますが、その後はmongoseの方法でいつでも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.Promisehttp://stackoverflow.com/questions/38138445/node3341-deprecationwarning-mongoose-mpromise

    MongoDB -> MySQL


    まず、なぜMongoDBからMySQLに移行するのですか?個人的に考えてみると、3つの状況があります.
  • は、タイミングサービスを通じて、MongoDBのデータの一部を分析し、MySQLに格納する.これでは、技術的な問題を解決する必要はなく、APIを書くだけで、APIはデータを取ってMongoDBの駆動でMongoDBデータベースに接続し、メモリデータはMySQLの駆動でMySQlに接続します.
  • MySQLにデータを直接移行する場合は、データベース間の移行のみです.しかし、必要ですか?なぜMySQL
  • に直接保存しないのですか?
  • リアルタイムでデータを分析するためにMySQLに移行する必要がある場合は、MongoDBもサポートします.
    https://www.mongodb.com/collateral/apache-spark-and-mongodb-turning-analytics-into-real-time-action

  • だからよく考えなければなりません.結論は以下の通りです.
  • はMongoDBのみで実現:MongoDBはすべての問題を解決できるようです.
  • 部分MongoDB部分MySQL、移行の問題に関与しません:ビジネスによって異なるsqlを使用します.
  • MySQLを移行します.

  • アリ雲MongoDB


    インストールには彼らの要求に従う必要があるほか、何の違いもないように見えます.環境がないのでテストできません.アリ雲ECSが必要

    ELSE

  • アーキテクチャhttps://www.mongodb.com/collateral/mongodb-architecture-guide
  • MongoDBリアルタイム分析https://www.mongodb.com/collateral/apache-spark-and-mongodb-turning-analytics-into-real-time-action
  • MongoDB結合BIhttps://docs.mongodb.com/bi-connector/master/