Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

MongoDB事始め。個人的まとめ

去年から触っているMongoDBですが、

あまりまとめる時間が無かったので、冬休みの娯楽として色々とまとめてみました。

Mongo DBって?

ドキュメント指向NoSQLデータベース一つです。

www.mongodb.com

MongoDBではリレーショナルデータベースとは違い、以下のようなJSON(正しくはBSON)形式のデータを格納して扱うことができるデータベースです。

IDが振られたデータをRDBで言うところのレコード(MongoDBではドキュメントと呼ぶ)でBSONを管理し、この単位で基本的な操作を実行します。

{ "_id" : ObjectId("5a4c7c92b3312b72b4d719f7"), "name" : "kazuya", "age" : 30 }
{ "_id" : ObjectId("5a4c7ccbb3312b72b4d719f8"), "name" : "hitomi", "loves" : [ "banana", "strawberry" ] }
{ "_id" : ObjectId("5a4c7cd6b3312b72b4d719f9"), "name" : "yuta", "loves" : [ "apple", "strawberry" ] }

はじめに型を定義する必要は無く、JSONの形式に則って、スキーマレスにデータのCRUD操作を行うことができます。

なので、上記ドキュメントを見ると、一つ目のドキュメントで、lovesのフィールドが存在しないことがわかるかと思います。

このように途中のドキュメントからスキーマ構造を変えたり、オブジェクトを追加して階層構造を深くしたり、ということも柔軟に実施することが可能です。

特徴

ドキュメント指向NoSQLの特性も含まれますが、MongoDBの特徴をざっくりまとめてみました。

  1. クロスプラットフォームサポートであること

    Windows版、Linux版、MacOS版が提供されていますね。

  2. スキーマレスであること

    上でも書いていますが、事前にスキーマを定義する必要がありません。Document生成時に動的にスキーマが構成される、と言ってもいいのかなと思います。なので開発途中・運用途中でプロパティが増えても、Collectionごと作り直すなどの必要が無いのはいいですね。

  3. Documentをスムーズに参照するための多様なクエリが提供されていること

    上記スキーマレスな構造を踏まえて、多様なクエリ方法が提供されています。配列要素をピックアップしてクエリしたり、JSONらしいネストされたオブジェクト構造に対してクエリをしたりと、この構造体を柔軟に参照するためのクエリがとても充実していて素晴らしいです。

  4. 開発がしやすいこと

    RDBをプログラミングで扱う場合、なんだかんだでORマッパー(私はEntityFrameworkとかぐらいしか知らないですが)でデータベース構造とプログラミングのオブジェクト構造を磨り合わせて実装するかと思いますが、MongoDBの場合データそのものが既にJSONライクなオブジェクト構造なため、プログラムへ寄せる際の摩擦が少ない、というのは大きな特徴(利点とも欠点とも、ここではあえて呼びません)だろうなぁと思います。

    あとMongoShellそのものがJavascriptライクに書けるのも、親しみやすいポイントですね。

  5. GIO系クエリが提供されていること

    RDBとしては、構造上扱いにくいGIO系データの専用クエリが提供されているのも面白いところ。

    Find Restaurants with Geospatial Queries — MongoDB Manual 3.6

  6. スケーラビリティしやすい

    コア機能として、高可用性を得るためのレプリカセットと呼ばれる機能と、

    gihyo.jp

    水平分散処理を行う仕組みであるオートシャーディング機能をサポートしています。

    このあたりの解説は以下がとても詳しいです。自分も一度色々と試してみたいところ・・・。

    MongoDB〜その性質と利用場面〜

  7. JOINをサポートしていない

    複数のDocumentを結合して、参照することはできません。実施したいとなれば、アプリケーション側で結合する必要がでてきます。

  8. トランザクションをサポートしていない

    複数の操作をまとめて、処理した際に、ロールバックさせるみたいな機能はありません。

8,9のあたりは、このDocument指向NoSQLという特性を維持するために必要な要素であろうとも思うので、そのあたりをどこまで割り切って使うことにするかが、ポイントなのかなぁと感じます。

MongoDBデータベース構造

MongoDBのデータ構造はRDBと結構近い感じです。

各ドキュメントがCollectionと呼ばれる、RDBで言うところのテーブルに格納され、各テーブルはDatabaseによって包括されています。

f:id:sugimomoto:20180103182651p:plain

MongoDBのGUI CRUDツール:MongoDB Compassを使ってみた

以下の画面はMongoDB公式から提供されているGUIでMongoDBを操作できるツールですが、

[myNewDatabase]というDatabaseに[myNewCollection]というCollectionが存在し、その中で2つのDocumentが格納されていることがわかるかと思います。

f:id:sugimomoto:20180103182712p:plain

dev.classmethod.jp

扱うことができる型

JSONを格納していると思われがちなんですが、実はBSONという形式です。(私もJSONだと思ってた)

BSON (Binary JSON) Serialization

JSONの場合、明示的に指定できる型は[Object, Array, String, Number , Bool, null]6種類ですが

http://www.json.org/

BSONの場合、21種類あるみたいです。

BSON Types — MongoDB Manual 3.6

使い方

インストーラーはWindowsLinuxMacOSの3種類が提供されているので、ローカルにインストールして試すことができます。

MongoDB Download Center | MongoDB

また、MongoDB AtlasというMongoDB社がAWSをバッググラウンドとして提供しているPaaSライクなサービスもあります。

このあたりは次回以降触れていきたいところ。

Enterprise Editionだと何が変わるのか?

MongoDBはCommunity EdtionとEnterpise Edtionの2つが提供されています。

一応公式では、技術サポートと共にエンタープライズ機能として、監視やKerberos証明書、セキュリティなどの機能がサポートされていると記載されています。

MongoDBの販売モデルであるサブスクリプションは、MongoDB社からの技術サポートに加え、MongoDBからのサポートに加え、エンタープライズ向けの機能を提供しています。このサブスクリプションを通してお客様は安定したIT環境の構築やスケーラビリティが保証され、さらにMongoDBの強みであるITコスト削減、迅速なアプリ開発、リスクの低減が実現します。

MongoDBのエンタープライズバージョンは、監視、SNMPサポート、Kerberos証明書、などのセキュリティ機能が強化されています。また、MongoDB Management Service (MMS)は、MongoDBエンタープライズバージョンで管理するシステム監視やデータベースバックアップを提供し、クラウド上、もしくはお客様のデータセンター上(On-Premise)で運用することができます。

MongoDBの概要 | MongoDB

ローカルで試すのであれば、Communityでも十分に役割を果たせますので、とりあえずCommunityをダウンロードでいいと思います。

参考

とりあえずこれだけは読んでおけというのは、以下の[MongoDBの薄い本]です。これを一通り読みながら、クエリを書いてみれば、基本的なことは理解できます。

MongoDBの薄い本

http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf

あとは公式のマニュアルもわかりやすいです。

Mongo DB Manual

The MongoDB 3.6 Manual — MongoDB Manual 3.6

以下のスライドもすごくわかりやすいです。

www.slideshare.net

おわりに

とりあえず、次回Windows版インストールと一通りのコマンドを叩いてみたいと思います。