MongoDB チートシート


書いてあること

  • MongoDB開発メモ

参考

MongoDB
やってみようNoSQL MongoDBを最速で理解する
MongoDBインデックス概要
mongo shellの操作まとめ

Dockerで利用

Dockerfile
# Base Image
FROM mongo:4.2.6-bionic

# Update and Installation
RUN apt-get update && \
  apt-get upgrade -y && \
  apt-get install -y --no-install-recommends nano libicu-dev && \
  apt-get install -y git && \
  rm -rf /var/lib/apt/lists/*

# Working Directory
WORKDIR /share

# Port
EXPOSE 27017

# Environment
ENV MONGO_INITDB_ROOT_USERNAME="root" \
    MONGO_INITDB_ROOT_PASSWORD="password"

# Command
CMD ["mongod"]
docker-compose.yml
version: '3'

# Service definition
services:

  mongo:
    # Dockerfile
    build: ./mongo
    # Image Name
    image: yoshi0518/mongo:4.2.6
    # Container Name
    container_name: mongo
    # Mount host directory(host:container)
    volumes:
      - ./data/share/mongo:/share
      - ./data/db:/data/db
      - ./data/configdb:/data/configdb
    # Port forwarding(host:container)
    ports:
      - 27017:27017
    # Continue container startup
    stdin_open: true
    tty: true
    # Restart
    restart: always

CentOSで利用

下記Webサイトを参考にインストール
Install MongoDB Community Edition on Red Hat or CentOS

インストール手順

リポジトリを追加

上記URLからリポジトリをコピー・貼り付け。

$ vi /etc/yum.repos.d/mongodb-org-4.2.repo
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

MongoDBをインストール

$ yum -y install mongodb-org

#インストールされたことを確認
$ rpm -qa | grep mongodb

サービスを起動・自動起動設定

$ systemctl start mongod
$ systemctl status mongod
$ systemctl enable mongod

バージョン確認

$ mongo --version

MongoDBとRDBの違い

MongoDB RDB
database database
collection table
document row
field column
index index
_id primary key

接続、切断

# MongoDB接続時にログイン(パスワードは対話形式で入力)
$ mongo -u ユーザー

# MongoDB接続時にログイン
# パスワードに記号を利用している場合は、記号の前に「\(バックスラッシュ)」を入力
$ mongo -u ユーザー -p パスワード

# MongoDBに接続してからログイン
$ mongo
$ use admin
$ db.auth('ユーザー', 'パスワード');
$ db.auth('userid', 'password');

# 切断
$ exit

# ヘルプ表示
$ help

データベース

MongoDBではコレクションやドキュメントが作成されるまでは、データベースが作成されたことにはならない。
そのためuseコマンド実行だけでは、show dbs;コマンドには表示されない。

# データベース一覧を表示
$ show dbs;

# データベース作成・接続先変更
$ use データベース名;
$ use testdb;

# データベース情報参照
$ db.status();

# データベース削除
$ db.dropDatabase();

コレクション

# コレクション一覧を表示
$ show collections;

# コレクション作成
$ db.createCollection('コレクション名');
$ db.createCollection('testcoll');

# コレクション名変更
$ db.コレクション名.renameCollection('変更後コレクション名');
$ db.testcoll.renameCollection('changecoll');

# コレクション削除
$ db.コレクション名.drop();
$ db.testcoll.drop();

ドキュメント

参照

# 全件・全フィールド表示
$ db.コレクション名.find({});
$ db.testcoll.find({});

# 全件・指定フィールド表示
# 1つ目の波括弧で抽出条件、2つ目の波括弧でフィールドの表示・非表示を指定。trueまたは1で表示、falseまたは0で非表示
# 通常は表示・非表示の混在したフィールドの指定はできないが、_idに限り表示・非表示を混在できる
$ db.コレクション名.find({}, {フィールド: true});
$ db.testcoll.find({}, {_id: false, name: true});

# 条件検索
$ db.コレクション名.find({フィールド: '値'});
$ db.testcoll.find({_id: ObjectId('5eaf361d0c386534b9f785aa')});
$ db.testcoll.find({name: 'name2'});

# 条件検索(比較演算子)
$ db.コレクション名.find({フィールド: {比較演算子, '値'}});
$ db.testcoll.find({name: {$ne: 'name3'}});
$ db.testcoll.find({age: {$gte: 40}});

# 条件検索(正規表現)
$ db.コレクション名.find({フィールド: /正規表現/});
$ db.testcoll.find({url: /test/});

# 条件検索(AND)
$ db.コレクション名.find({フィールド: '値', フィールド: '値'});
$ db.testcoll.find({name: 'name4', age: {$gte: 40}});

# 条件検索(OR)
$ db.コレクション名.find({$or: [{フィールド: '値'}, {フィールド: '値'}]});
$ db.testcoll.find({$or: [{name: 'name2'}, {age: 45}]});

# 条件検索(IN)
$ db.コレクション名.find({フィールド: {$in: [値, 値, ...]}});
$ db.testcoll.find({name: {$in: ['name3', 'name5']}});

# 条件検索(フィールドの存在確認)
$ db.コレクション名.find({フィールド: {$exists: true}});
$ db.コレクション名.find({フィールド: {$exists: false}});
$ db.testcoll.find({age: {$exists: true}});
$ db.testcoll.find({age: {$exists: false}});

# 指定フィールドに存在する値を表示
$ db.コレクション名.distinct('フィールド');
$ db.testcoll.distinct('like');

# 並び替え
# 1で昇順、-1で降順
$ db.コレクション名.find({}).sort({フィールド: 1});
$ db.コレクション名.find({}).sort({フィールド: -1});
$ db.testcoll.find({}).sort({age: -1});

# 1行取得
$ db.コレクション名.findOne();
$ db.testcoll.findOne();
$ db.testcoll.findOne({name: 'name4'});

# 複数行取得
$ db.コレクション名.find({}).limit(件数);
$ db.testcoll.find({}).sort({age: -1}).limit(2);

# スキップ
$ db.コレクション名.find({}).skip(件数);
$ db.testcoll.find({}).sort({name: -1}).skip(2);

# 件数取得
# $existsを利用することにより、指定フィールドを保持するドキュメントのみカウント対象とすることが可能
$ db.コレクション名.count();
$ db.testcoll.count();
$ db.testcoll.find({age: {$exists: true}}).count();

比較演算子

演算子 説明
$eq 一致
$ne 不一致
$gt 超える
$gte 以上
$lt 未満
$lte 以下

追加

# 1件追加
$ db.コレクション名.insert({フィールド, '値'});
$ db.testcoll.insert({name: 'name1', age: 30, email: '[email protected]', url: 'https://www.name1.example.com', like: ['Google', 'Yahoo', 'Amazon']});

# 複数件追加
$ db.コレクション名.insert([{フィールド, '値'}, {フィールド, '値'}]);
$ db.testcoll.insert([{name: 'name2', age: 35, url: 'https://www.name2.example.com', like: ['Google']}, {name: 'name3', email: '[email protected]', url: 'https://www.name3.example.com', like: ['Yahoo', 'Rakuten']}, {name: 'name4', age: 40, url: 'https://www.name4.test.com', like: ['Google', 'Amazon']}, {name: 'name5', age: 45, email: '[email protected]', url: 'https://www.name5.test.com', like: ['Amazon', 'Rakuten']}]);

更新

1つ目が抽出条件、2つ目が更新内容

# 指定フィールドの追加・更新
$ db.コレクション名.update({フィールド: '値'}, {$set: {フィールド: '値'}});
$ db.testcoll.update({name: 'name2'}, {$set: {age: 25}});

# 指定フィールドの削除
$ db.コレクション名.update({フィールド: '値'}, {$unset: {フィールド: ''}});
$ db.testcoll.update({}, {$unset: {young: ''}}, {multi: true});

# 指定ドキュメントを洗い替え
$ db.コレクション名.update({フィールド: '値'}, {フィールド: '値'});
$ db.testcoll.update({name: 'name2'}, {name: 'name2', age: 35, url: 'https://www.name2.example.com', like: ['Google']});

# 更新対象のドキュメントをすべて更新
$ db.コレクション名.update({フィールド: '値'}, {フィールド: '値'}, {multi: true});
$ db.testcoll.update({age: {$lte: 35}}, {$set: {young: true}}, {multi: true});

# 更新対象のドキュメントが存在しない場合は追加
$ db.コレクション名.update({フィールド: '値'}, {フィールド: '値'}, {upsert: true});
$ db.testcoll.update({name: 'name1'}, {name: 'name1', age: 30, email: '[email protected]', url: 'https://www.name1.example.com', like: ['Google', 'Yahoo', 'Amazon']}, {upsert: true});

# フィールド名変更
$ db.コレクション名.update({フィールド: '値'}, {$rename: {フィールド: '変更後フィールド名'}});
$ db.testcoll.update({}, {$rename: {like: 'love'}}, {multi: true});

削除

# 全件削除
$ db.コレクション名.remove({});
$ db.testcoll.remove({});

# 指定したドキュメントを削除
$ db.コレクション名.remove({フィールド: '値'})
$ db.testcoll.remove({name: 'name1'});

インデックス

# インデックス確認
$ db.コレクション名.getIndexes();
$ db.testcoll.getIndexes();

# インデックス作成
# 1で昇順、-1で降順
$ db.コレクション名.createIndex({フィールド: 並び順}, {name: 'インデックス名'});
$ db.testcoll.createIndex({name: 1}, {name: 'Idx_name'});

# ユニークインデックス作成
$ db.コレクション名.createIndex({フィールド: 並び順}, {unique: true});
$ db.testcoll.createIndex({name: 1}, {name: 'Idx_name', unique: true});

# インデックス削除
$ db.コレクション名.dropIndex('インデックス名');
$ db.testcoll.dropIndex('Idx_name');

バックアップ・リストア

# バックアップ実行前に出力先ディレクトリを削除
$ rm -fr 出力先ディレクトリ
$ rm -fr ./backup

# すべてのデータベースをバックアップ
# パスワードに記号を利用している場合は、記号の前に「\(バックスラッシュ)」を入力
$ mongodump -u ユーザー -p パスワード --out 出力先ディレクトリ
$ mongodump -u root -p password --out ./backup

# 指定したデータベースをバックアップ
# パスワードに記号を利用している場合は、記号の前に「\(バックスラッシュ)」を入力
# ユーザー認証で利用するデータベースを合わせて指定する必要あり
$ mongodump -u ユーザー -p パスワード --db バックアップするデータベース --authenticationDatabase ユーザー認証で利用するデータベース --out 出力先ディレクトリ
$ mongodump -u root -p password --db testdb --authenticationDatabase admin --out ./backup

# リストア前に対象のデータベースを削除
$ use 削除するデータベース;
$ db.dropDatabase();

# 指定したデータベースをリストア
$ mongorestore -u ユーザー -p パスワード --db リストアするデータベース --authenticationDatabase ユーザー認証で利用するデータベース バックアップファイル
$ mongorestore -u root -p password --db testdb --authenticationDatabase admin ./backup/testdb

# リストア前に対象のコレクションを削除
$ db.コレクション名.drop();
$ db.testcoll.drop();

# 指定したコレクションをリストア
$ mongorestore -u ユーザー -p パスワード --db リストアするデータベース --authenticationDatabase ユーザー認証で利用するデータベース --collection リストアするコレクション バックアップファイル.bson
$ mongorestore -u root -p password --db testdb --authenticationDatabase admin --collection testcoll ./backup/testdb/testcoll.bson

# エクスポート(JSON)
$ mongoexport -u ユーザー -p パスワード --db データベース --authenticationDatabase ユーザー認証で利用するデータベース --collection エクスポートするコレクション --out 出力ファイル
$ mongoexport -u root -p password --db testdb --authenticationDatabase admin --collection testcoll --out ./export/testcoll.json

# エクスポート(CSV)
# CSVファイルをエクスポートする場合、fieldsの指定は必須
$ mongoexport -u ユーザー -p パスワード --db データベース --authenticationDatabase ユーザー認証で利用するデータベース --collection エクスポートするコレクション --type csv --fields フィールド,フィールド,... --out 出力ファイル
$ mongoexport -u root -p password --db testdb --authenticationDatabase admin --collection testcoll --type csv --fields name,age,email,like --out ./export/testcoll.csv

その他

MongoDBのクエリ言語(JavaScript)では下記のような利用方法が可能。

変数宣言、参照

配列、オブジェクトのようにフィールドを参照可能

// コレクションの参照結果を変数に格納
$ let coll = db.testcoll.find({});

// 変数を利用してフィールドを参照
$ printjson(coll[0][like][1]);

制御構造

// for文でドキュメントを繰り返し追加
$ for(let i = 1; i <= 10; i++) {
$ db.testcoll.insert({name: `name${i}`});
$ }