# MongoDBの操作方法 (3.6 以下)
# はじめに
ここでは、古い MongoDB 3.6以下 の操作方法を記載しています。最新版の操作方法とは異なる点があります。
# 基本
# find(select)
データを取得するコマンドです。
// 全件取得 (SELECT * FROM user)
db.user.find();
// 特定のフィールドだけを射影 (SELECT name, email FROM user)
db.user.find({}, { name: 1, email: 1, _id: 0 }); // _id: 0 で_idを表示から除外
// _idを降順 (desc) でソートし、最新レコード1件取得
db.user.find().sort({ _id: -1 }).limit(1);
// 条件検索 (WHERE _id = ...)
db.user.find({_id:ObjectId("66fc838041c6a10015b790efbc")});
// AND条件 (WHERE _id = ... AND disable_flg = 0)
db.user.find({ _id:ObjectId("66fc838041c6a10015b790efbc"), disable_flg:0 });
// OR条件 (WHERE _id = ... OR _id = ...)
db.user.find({
$or: [
{ _id: ObjectId("66fc838041c6a10015b790efbc") },
{ _id: ObjectId("6774ed80d9e2f4003a21c3b01e") }
]
});
// IN条件 (ORの簡潔な書き方)
db.user.find({
_id: { $in: [
ObjectId("66fc838041c6a10015b790efbc"),
ObjectId("6774ed80d9e2f4003a21c3b01e")
]}
});
// 比較演算子 ($gt: Greater Than)
db.user.find({ age: { $gt: 20 } });
// indexの確認
db.user.getIndexes();
# CRUD (Create, Read, Update, Delete)
// 登録 (Insert)
// ドキュメントを1件登録
db.user.insert({ name: "Taro", age: 30, disable_flg: 0, created_at: new Date() });
// 複数ドキュメントを登録
db.user.insert([
{ name: "Jiro", age: 25 },
{ name: "Saburo", age: 40 }
]);
// 更新 (Update)
// 1件更新 (nameが"Taro"のドキュメントのageを45にセット)
db.user.update(
{ name: "Taro" },
{ $set: { age: 45 } }
);
// 複数件更新 (disable_flgが1のドキュメント全てにdeleted_atを追加)
db.user.update(
{ disable_flg: 1 },
{ $set: { deleted_at: new Date() } },
{ multi: true } // 複数件更新フラグ (3.6以下で重要)
);
// UPSERT (条件に一致するものがなければ新規登録)
db.user.update(
{ name: "Hanako" },
{ $set: { age: 28 } },
{ upsert: true }
);
// 削除 (Delete)
// 条件に一致するドキュメントを全て削除
db.user.remove({ "_id" : ObjectId("68cdb5912057da0100f8059e") });
// 全件削除 (コレクションを空にする)
db.user.remove({});
# DDL (Data Definition Language) / データベース管理
# コレクション操作
// コレクションの作成 (ドキュメントをinsertすれば自動作成されるため通常不要)
db.createCollection("new_collection");
// コレクションの削除
db.user.drop();
// コレクション名の変更
db.user.renameCollection("users_backup");
// 現在のデータベース名の確認
db.getName();
// データベースを切り替える (存在しない場合は作成)
use my_new_db;
# インデックス操作
// index追加 (nameフィールドに昇順インデックスを作成)
db.user.ensureIndex({ name: 1 }); // 3.6以下での記述。createIndexと同義。
// 複合インデックス (name昇順, age降順)
db.user.ensureIndex({ name: 1, age: -1 });
// UK (Unique Key) 追加 (emailフィールドに一意制約インデックスを作成)
db.user.ensureIndex({ email: 1 }, { unique: true });
// index削除 (nameフィールドのインデックスを削除)
db.user.dropIndex("name_1"); // インデックス名は getIndexes() で確認
// 全てのインデックスを削除 (_idインデックスを除く)
db.user.dropIndexes();
# 応用・ユーティリティ
// 実行計画の確認 (インデックスが使われているか、効率的かを確認)
db.user.find({ age: { $gt: 20 } }).explain();
// ドキュメントの件数取得
db.user.count();
// または
db.user.find().count();
// 表示件数を増やす (シェルのfind実行時のデフォルト表示件数)
DBQuery.shellBatchSize = 10000;
// コレクションの統計情報の確認
db.user.stats();
// データベースの統計情報の確認
db.stats();