仕事でMongoDBを少し触る機会ができたので、概念とか基本的なコマンドについて少し書いてみます。

MongoDB


MongoDBはいわゆるNoSQL(Not Only SQL)データベースの一種です。
NoSQLデータベース定義は今のところあいまいなようで、大雑把に書くとRDBでないものがまとめてNoSQLデータベースと呼ばれているようです。NoSQLデータベースにも種類がたくさんあって、MongoDBはドキュメント指向データベースです。
この辺の詳しい話はこことかここが参考になると思います。

用語

下記は既存のDBとの用語の比較です。

RDBMongoDB
(ORACLEでいうスキーマ)データベース
テーブルコレクション
カラムフィールド
レコードドキュメント

コレクションとフィールド

コレクション(テーブル)にフィールド(カラム)の定義は存在しません。そのため、同じコレクション内に異なるフィールドを持つドキュメント(レコード)を作成することが可能です。(もうこの時点でRDBしか触ったことない人間には意味不明…用語もややこしいし…)

ただし、コレクションの「_id」フィールドは絶対必要なようで、これがプライマリーキーになります。なお、「_id」フィールドは 指定しなかった場合はINSERT時に自動で作成されます。(ハッシュ値が振られる)ちなみに、コレクションはわざわざ作成しなくてもINSERT時に存在しなければ 自動で作成されます。

トランザクション

MongoDBも含めてNoSQLデータベースにはトランザクションがないものがあります。トランザクションが必要な場合は自分で相当する機能を実装する必要があるようです。この辺参照

操作


SQL相当の操作はJSON形式で行います。

ログイン

1
monogo ***.***.***.***:27017/"データベース名" -u "ユーザー" -p "パスワード"

デフォルトのポートは27017です。
「データベース名」は省略可能です。「ユーザー/パスワード」も存在しない場合は省略可能です。

データベースの状態

非常に紛らわしいですが、「status」ではないです。

1
db.stats();

データベース表示

1
show dbs;

使用するデータベースの指定

1
use "データベース名";

コレクションの一覧

先に「use」で使用するデータベースを指定します。

1
show collections;

SELECT

1
2
3
4
5
6
7
8
//全件取得「{}」はありなしどちらでも行けます。
db.コレクション名.find();
db.コレクション名.find({});

//条件指定
db.コレクション名.find({フィールド名:"値"});
//複数条件(カンマで区切る)
db.コレクション名.find({フィールド名:"値", フィールド名:"値"});

EXISTS

MongoDBのexistsはフィールドが存在するかどうかを指します。 データが存在するかどうかではありません!
たとえば、特定のフィールド(カラム)を持つドキュメント(レコード)を取得する場合は次のように書きます。

1
db.コレクション名.find({フィールド名:{$exists:true},追加の検索条件....});

INSERT

前述の通り、「_id」を指定した場合はその「_id」が、指定しなかった場合はハッシュ値が自動で振られます。「_id」はプライマリキーなので当然重複はできません。また、これも前述の通り存在しないコレクションを指定した場合は 自動でコレクションが作成されます。 便利だね~

1
2
db.コレクション名.insert({フィールド名:"値", フィールド名:"値"});
db.コレクション名.insert({"_id" : 1 ,フィールド名:"値", フィールド名:"値"});

UPDATE

1
db.コレクション名.update({"_id" : 1}, {$set:{フィールド名:"値"}});

DELETE

全件削除する場合に2.x系と3.x系で微妙に違うので注意です。

1
2
3
4
5
6
7
8
//全レコード削除(2.×系)
db.コレクション名.remove();

//全レコード削除(3.×系)
db.コレクション名.remove({});

//指定して削除
db.コレクション名.remove({フィールド名:"値"});

GUI


CLIでの操作について書きましたが、GUIで操作する場合は「Robomongo」か「mongo-express」あたりが良いと思います。この2つは割と頻繁にコミットされていてユーザも多そうでした。「Robomongo」は各OSのインストーラがあります。「mongo-express」はnode.jsで動かします。

私は最初に「Robomongo」を試しましたがなぜか接続できずに「mongo-express」を使いました。次あたりは「mongo-express」について書きたいな~

と、思ってたんですが…今回はMongoDBを使わないという判断になったので、そのあたりは気が向いたら書きます。残念…