# MongoDBの操作方法 (4.x 以降 最新版)
# はじめに
ここでは、MongoDB 4.x 以降 (5.x / 6.x / 7.x も含む) の最新操作方法を記載しています。
古い update() や remove() などは非推奨・削除されているため、置き換え済みの記述です。
# 基本
# find(select)
データを取得するコマンドです。
// 全件取得 (SELECT * FROM user)
db.user.find();
// 特定のフィールドだけを射影 (SELECT name, email FROM user)
db.user.find({}, { projection: { name: 1, email: 1, _id: 0 } });
// _idを降順 (desc) でソートし、最新レコード1件取得
db.user.find().sort({ _id: -1 }).limit(1);
// 条件検索 (WHERE _id = ...)
db.user.find({ _id: ObjectId("66fc838041c6a10015b790efbc") });
// AND条件
db.user.find({ _id: ObjectId("66fc838041c6a10015b790efbc"), disable_flg: 0 });
// OR条件
db.user.find({
$or: [
{ _id: ObjectId("66fc838041c6a10015b790efbc") },
{ _id: ObjectId("6774ed80d9e2f4003a21c3b01e") }
]
});
// IN条件
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.insertOne({ name: "Taro", age: 30, disable_flg: 0, created_at: new Date() });
// 複数ドキュメントを登録
db.user.insertMany([
{ name: "Jiro", age: 25 },
{ name: "Saburo", age: 40 }
]);
// 更新 (Update)
// 1件更新
db.user.updateOne(
{ name: "Taro" },
{ $set: { age: 45 } }
);
// 複数件更新
db.user.updateMany(
{ disable_flg: 1 },
{ $set: { deleted_at: new Date() } }
);
// UPSERT
db.user.updateOne(
{ name: "Hanako" },
{ $set: { age: 28 } },
{ upsert: true }
);
// 削除 (Delete)
// 1件削除
db.user.deleteOne({ _id: ObjectId("68cdb5912057da0100f8059e") });
// 複数件削除
db.user.deleteMany({ disable_flg: 1 });
// 全件削除 (コレクションを空にする)
db.user.deleteMany({});
# DDL (Data Definition Language) / データベース管理
# コレクション操作
// コレクションの作成
db.createCollection("new_collection");
// コレクションの削除
db.user.drop();
// コレクション名の変更
db.user.renameCollection("users_backup");
// 現在のデータベース名の確認
db.getName();
// データベースを切り替える
use my_new_db;
# インデックス操作
// index追加 (nameフィールドに昇順インデックスを作成)
db.user.createIndex({ name: 1 });
// 複合インデックス (name昇順, age降順)
db.user.createIndex({ name: 1, age: -1 });
// UK (Unique Key) 追加
db.user.createIndex({ email: 1 }, { unique: true });
// index削除 (nameフィールドのインデックスを削除)
db.user.dropIndex("name_1"); // インデックス名は getIndexes() で確認
// 全てのインデックスを削除 (_idインデックスを除く)
db.user.dropIndexes();
# 応用・ユーティリティ
// 実行計画の確認
db.user.find({ age: { $gt: 20 } }).explain("executionStats");
// ドキュメントの件数取得
db.user.countDocuments();
db.user.estimatedDocumentCount();
// 表示件数を増やす (シェルのfind実行時)
DBQuery.shellBatchSize = 10000;
// コレクションの統計情報の確認
db.user.stats();
// データベースの統計情報の確認
db.stats();