# 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();