mongoコマンド チートシート

接続と基本操作

mongo シェルへの接続方法と、接続後の基本的な操作コマンドです。

コマンド/メソッド説明使用例
mongoMongoDB インスタンスに接続します。ホスト、ポート、認証情報などを指定できます。
# ローカルホストのデフォルトポート (27017) に接続
mongo
# ホストとポートを指定して接続
mongo --host myhost.example.com --port 27018
# ユーザー認証して接続
mongo --host myhost --port 27017 -u myUser -p myPassword --authenticationDatabase admin
# 特定のデータベースに接続
mongo mydatabase
# URI を使用して接続 (推奨)
mongo "mongodb://myUser:myPassword@myhost:27017/mydatabase?authSource=admin"
show dbsサーバー上のすべてのデータベースのリストを表示します。
show dbs
use <database>作業対象のデータベースを切り替えます。指定したデータベースが存在しない場合は、最初のデータ挿入時に作成されます。
use myAppDb
db現在選択されているデータベースオブジェクトを表示します。
db
show collections現在のデータベース内のすべてのコレクションを表示します。
show collections
db.version()接続している MongoDB サーバーのバージョンを表示します。
db.version()
db.serverStatus()MongoDB サーバーの状態に関する詳細情報を表示します (接続数、メモリ使用量、ネットワーク情報など)。
db.serverStatus()
db.stats()現在のデータベースの統計情報(データサイズ、ストレージサイズ、オブジェクト数、インデックス数など)を表示します。
db.stats()
helpmongo シェルで使用可能なコマンドやメソッドのヘルプ情報を表示します。
help
db.collection.help()指定したコレクションオブジェクトで使用可能なメソッドのヘルプを表示します。
db.users.help()
cls / clearシェルの画面をクリアします。
cls
clear
exit / quit()mongo シェルを終了します。Ctrl+C を2回押すことでも終了できます。
exit
quit()
load("path/to/script.js")指定した JavaScript ファイルを読み込んで実行します。複雑な操作や繰り返し処理をスクリプト化するのに便利です。
// setup.js ファイルを実行
load("setup.js")

データベース操作

データベースの作成、削除、状態確認などに関連する操作です。

コマンド/メソッド説明使用例
use <database>データベースを選択または作成します。データベースは、最初のコレクションまたはドキュメントが挿入されるまで実際には作成されません。
// newDb が存在しなければ、後続のデータ挿入時に作成される
use newDb
db.dropDatabase()現在選択しているデータベースを完全に削除します。注意: この操作は元に戻せません。
// 現在のデータベースを削除
db.dropDatabase()
db.getName()現在選択しているデータベースの名前を取得します。
db.getName()
db.getCollectionNames()現在のデータベースに存在するコレクション名の配列を取得します。show collections と似ていますが、結果をプログラムで扱いやすい形式で返します。
db.getCollectionNames()
db.copyDatabase(fromdb, todb, fromhost)別のデータベースの内容を現在のデータベースにコピーします。主に異なる MongoDB インスタンス間でデータをコピーする際に使用します。
// localhost の backupDb を現在のデータベースにコピー
db.copyDatabase("backupDb", db.getName())
// remotehost の sourceDb を現在のデータベースにコピー
db.copyDatabase("sourceDb", db.getName(), "remotehost.example.com")

このコマンドは非推奨 (deprecated) となっており、将来のバージョンで削除される可能性があります。代わりに mongodumpmongorestore の使用が推奨されます。

db.cloneDatabase(fromhost)別の MongoDB インスタンスから現在のデータベースを複製(クローン)します。コピー元のデータベース名は現在のデータベース名と同じである必要があります。
// remotehost.example.com から現在のデータベースと同じ名前のデータベースを複製
db.cloneDatabase("remotehost.example.com")

このコマンドも非推奨です。mongodumpmongorestore の使用が推奨されます。

コレクション操作

コレクション(RDB のテーブルに相当)の作成、削除、リネームなどに関する操作です。

コマンド/メソッド説明使用例
db.createCollection("name", options)明示的にコレクションを作成します。ドキュメント挿入時にも暗黙的に作成されますが、Capped Collection やバリデーションルールを指定する場合はこのメソッドを使用します。
// 基本的なコレクション作成
db.createCollection("users")
// Capped Collection (サイズ 1MB, 最大 1000 ドキュメント) を作成
db.createCollection("logs", { capped: true, size: 1048576, max: 1000 })
// バリデーションルール付きでコレクション作成
db.createCollection("products", { validator: { $jsonSchema: { bsonType: "object", required: [ "name", "price" ], properties: { name: { bsonType: "string", description: "must be a string and is required" }, price: { bsonType: "double", minimum: 0, description: "must be a double and is required" }, stock: { bsonType: "int" } } } }, validationLevel: "strict", // moderate もしくは off validationAction: "error" // warn もしくは error
})
db.collection.drop()指定したコレクションを削除します。関連するインデックスもすべて削除されます。注意: この操作は元に戻せません。
// users コレクションを削除
db.users.drop()
db.collection.renameCollection("newName", dropTarget)コレクションの名前を変更します。dropTarget が true の場合、変更先の名前のコレクションが既に存在すれば上書きします(デフォルトは false で、存在する場合はエラー)。
// users コレクションを customers にリネーム
db.users.renameCollection("customers")
// logs コレクションを old_logs にリネーム (old_logs が存在すれば上書き)
db.logs.renameCollection("old_logs", true)

シャーディング環境では、この操作には制限があります。

db.getCollection("name")指定された名前のコレクションオブジェクトを取得します。コレクション名にハイフンなどの特殊文字が含まれる場合に便利です。
// "user-profiles" という名前のコレクションを取得
var profiles = db.getCollection("user-profiles")
profiles.find()
db.collection.stats()コレクションの統計情報(ドキュメント数、サイズ、インデックス情報など)を表示します。
db.products.stats()
db.collection.storageSize()コレクションがディスク上で占めるストレージサイズ(バイト単位)を返します。
db.logs.storageSize()
db.collection.totalSize()コレクションのデータサイズとインデックスサイズの合計(バイト単位)を返します。
db.users.totalSize()
db.collection.validate({full: true})コレクションの内部構造を検証し、破損や不整合がないかチェックします。full: true オプションはより詳細なチェックを行いますが、時間がかかる場合があります。
// 基本的な検証
db.orders.validate()
// 詳細な検証
db.orders.validate({ full: true })
db.collection.convertToCapped(sizeInBytes)既存の非 Capped Collection を Capped Collection に変換します。変換後のサイズをバイト単位で指定します。
// events コレクションを 10MB の Capped Collection に変換
db.events.convertToCapped(10 * 1024 * 1024)

この操作はコレクションをロックするため、実行中は書き込みがブロックされる可能性があります。

ドキュメント操作 (CRUD)

コレクション内のドキュメント(RDB の行に相当)に対する基本的な作成 (Create)、読み取り (Read)、更新 (Update)、削除 (Delete) 操作です。

作成 (Create)

メソッド説明使用例
db.collection.insertOne(document, options)単一のドキュメントをコレクションに挿入します。_id フィールドが指定されていない場合、自動的に ObjectId が生成されます。
// 単一ドキュメントの挿入
db.users.insertOne({ name: "Alice", age: 30, city: "New York" })
// Write Concern を指定して挿入 (レプリカセット環境で重要)
db.products.insertOne( { item: "pencil", qty: 50 }, { writeConcern: { w: "majority", wtimeout: 5000 } }
)
db.collection.insertMany(documents, options)複数のドキュメントを配列として受け取り、一括で挿入します。ordered: false オプションを指定すると、挿入エラーが発生しても残りのドキュメントの挿入を試みます(デフォルトは true で、エラー発生時に停止)。
// 複数ドキュメントの挿入
db.users.insertMany([ { name: "Bob", age: 25, city: "London" }, { name: "Charlie", age: 35, city: "Paris" }
])
// 順序指定なしで挿入 (エラーが発生しても継続)
db.inventory.insertMany( [ { item: "notebook", qty: 100 }, { _id: 1, item: "pen", qty: 200 }, // 既存の_idと重複する可能性 { item: "eraser", qty: 50 } ], { ordered: false }
)
db.collection.insert(documentOrArray, options)単一または複数のドキュメントを挿入します。古いメソッドですが、後方互換性のために残されています。insertOne() または insertMany() の使用が推奨されます。
// 単一 (非推奨)
db.legacy.insert({ status: "active" })
// 複数 (非推奨)
db.legacy.insert([ { code: 1 }, { code: 2 } ])

このメソッドは非推奨です。insertOne() または insertMany() を使用してください。

db.collection.save(document, options)ドキュメントを挿入または更新します。ドキュメントに _id が存在し、その _id がコレクション内に既に存在する場合は更新 (upsert)、存在しない場合または _id がない場合は挿入します。
// _id がないので挿入される
db.items.save({ name: "itemA", value: 10 })
// _id が存在し、コレクション内に対応するドキュメントがあれば更新、なければ挿入
var existingItem = db.items.findOne({ name: "itemA" });
if (existingItem) { existingItem.value = 15; db.items.save(existingItem); // 更新
}
db.items.save({ _id: ObjectId("..."), name: "itemB", value: 20 }) // _id が存在すれば更新、なければ挿入

このメソッドも非推奨に近いです。挿入には insertOne/insertMany、更新には updateOne/updateMany/replaceOne の `upsert: true` オプションの使用が推奨されます。

読み取り (Read)

メソッド説明使用例
db.collection.find(query, projection)指定したクエリ条件に一致するドキュメントを検索し、カーソルを返します。projection で返すフィールドを指定できます。
// 全てのドキュメントを検索
db.users.find()
// city が "New York" のドキュメントを検索
db.users.find({ city: "New York" })
// age が 30 より大きいドキュメントを検索
db.users.find({ age: { $gt: 30 } })
// name と email フィールドのみを返す ( _id はデフォルトで返される)
db.users.find({ city: "London" }, { name: 1, email: 1 })
// name と email フィールドのみを返し、_id は返さない
db.users.find({ city: "London" }, { name: 1, email: 1, _id: 0 })
db.collection.findOne(query, projection)指定したクエリ条件に一致する最初のドキュメントを検索し、そのドキュメントを返します。一致するドキュメントがない場合は null を返します。
// name が "Alice" の最初のドキュメントを取得
db.users.findOne({ name: "Alice" })
// city が "Paris" で、name フィールドのみを取得 (_idも返る)
db.users.findOne({ city: "Paris" }, { name: 1 })
カーソルメソッド (limit(), skip(), sort(), count(), pretty())find() が返すカーソルに対して、結果の件数制限、スキップ、ソート、件数取得、整形表示などを行います。メソッドチェーンで繋げて使用します。
// age が 25 以上のユーザーを age の昇順でソートし、最初の 5 件を取得
db.users.find({ age: { $gte: 25 } }).sort({ age: 1 }).limit(5)
// city が "New York" のユーザーを name の降順でソートし、最初の 2 件をスキップして次の 10 件を取得
db.users.find({ city: "New York" }).sort({ name: -1 }).skip(2).limit(10)
// 条件に一致するドキュメント数を取得 (v4.0以降は countDocuments/estimatedDocumentCount 推奨)
db.users.find({ status: "active" }).count()
// 結果を整形して表示
db.products.find({ category: "electronics" }).pretty()
db.collection.countDocuments(query, options)クエリ条件に一致するドキュメントの正確な数をカウントします。大規模なコレクションでは estimatedDocumentCount() より遅くなる可能性があります。
// status が "active" のドキュメント数を正確にカウント
db.users.countDocuments({ status: "active" })
// age が 30 より大きいドキュメント数をカウント
db.users.countDocuments({ age: { $gt: 30 } })
db.collection.estimatedDocumentCount(options)コレクション内の全ドキュメント数を、メタデータを使用して高速に推定します。クエリ条件は指定できません。シャットダウンが正常に行われなかった場合など、正確でない可能性があります。
// コレクションの全ドキュメント数を高速に推定
db.logs.estimatedDocumentCount()
db.collection.distinct(field, query, options)指定したフィールドについて、重複しない値のリストを返します。クエリで対象ドキュメントを絞り込むことも可能です。
// users コレクション内の全てのユニークな city のリストを取得
db.users.distinct("city")
// status が "active" のユーザーのユニークな department のリストを取得
db.users.distinct("department", { status: "active" })

更新 (Update)

既存のドキュメントを変更する操作です。更新演算子 ($set, $inc, $push など) を使用してフィールド値を変更します。

主な更新演算子:

  • $set: 指定したフィールドの値を設定または更新します。フィールドが存在しない場合は作成します。
  • $unset: 指定したフィールドを削除します。
  • $inc: 指定したフィールドの値を指定した量だけ増減させます (数値フィールドのみ)。フィールドが存在しない場合は作成して指定した量に設定します。
  • $mul: 指定したフィールドの値に指定した数値を乗算します (数値フィールドのみ)。
  • $rename: フィールド名を変更します。
  • $min: 指定した値がフィールドの現在の値より小さい場合にフィールドの値を更新します。
  • $max: 指定した値がフィールドの現在の値より大きい場合にフィールドの値を更新します。
  • $currentDate: フィールドの値を現在の日付またはタイムスタンプに設定します。
  • $push: 配列フィールドの末尾に要素を追加します。
  • $addToSet: 配列フィールドに要素が存在しない場合のみ追加します (重複を防ぐ)。
  • $pull: 配列フィールドから条件に一致するすべての要素を削除します。
  • $pop: 配列フィールドの先頭 (-1) または末尾 (1) の要素を削除します。
メソッド説明使用例
db.collection.updateOne(filter, update, options)フィルタ条件に一致する最初のドキュメントを更新します。update ドキュメントには更新演算子を使用します。optionsupsert: true を指定すると、一致するドキュメントがない場合に新しいドキュメントを挿入します。
// name が "Alice" の最初のユーザーの age を 31 に、city を "San Francisco" に更新
db.users.updateOne( { name: "Alice" }, { $set: { age: 31, city: "San Francisco" }, $currentDate: { lastModified: true } }
)
// item が "pen" の最初の在庫の qty を 10 増やす
db.inventory.updateOne( { item: "pen" }, { $inc: { qty: 10 } }
)
// email が "new@example.com" のユーザーを探し、なければ挿入 (upsert)
db.users.updateOne( { email: "new@example.com" }, { $set: { name: "New User", status: "pending" }, $setOnInsert: { createdAt: new Date() } }, { upsert: true }
)
db.collection.updateMany(filter, update, options)フィルタ条件に一致するすべてのドキュメントを更新します。update ドキュメントには更新演算子を使用します。optionsupsert: true も指定できますが、通常は複数ドキュメントを対象とするため、意図しない挿入が起こる可能性があります。
// city が "London" の全てのユーザーの status を "inactive" に更新
db.users.updateMany( { city: "London" }, { $set: { status: "inactive" }, $currentDate: { lastModified: true } }
)
// 全ての商品の価格を 10% 引き上げる (少数誤差に注意)
db.products.updateMany( {}, { $mul: { price: 1.1 } }
)
// qty が 0 未満の全ての在庫に "low_stock" タグを追加 (重複なし)
db.inventory.updateMany( { qty: { $lt: 0 } }, { $addToSet: { tags: "low_stock" } }
)
db.collection.replaceOne(filter, replacement, options)フィルタ条件に一致する最初のドキュメント全体を、指定した replacement ドキュメントで置き換えます。_id フィールドは変更できません。更新演算子は使用できません。optionsupsert: true を指定すると、一致するドキュメントがない場合に新しいドキュメントを挿入します。
// name が "Charlie" の最初のユーザーのドキュメント全体を置き換え (_id は維持される)
db.users.replaceOne( { name: "Charlie" }, { name: "Charles", age: 36, city: "Lyon", status: "active", lastModified: new Date() }
)
// sku が "XYZ" の商品を置き換え、なければ挿入 (upsert)
db.products.replaceOne( { sku: "XYZ" }, { sku: "XYZ", name: "New Product", price: 99.99, category: "new" }, { upsert: true }
)
db.collection.update(query, update, options)古い更新メソッド。デフォルトでは条件に一致する最初のドキュメントのみを更新します。複数ドキュメントを更新するには multi: true オプションが必要です。upsert: true も指定可能です。
// 最初の status が "pending" のドキュメントを "active" に更新 (非推奨)
db.orders.update({ status: "pending" }, { $set: { status: "active" } })
// 全ての status が "shipped" のドキュメントに shippedDate を追加 (非推奨)
db.orders.update( { status: "shipped" }, { $currentDate: { shippedDate: true } }, { multi: true }
)
// user_id が 123 の設定を探し、なければ挿入 (非推奨)
db.settings.update( { user_id: 123 }, { $set: { theme: "dark", notifications: true } }, { upsert: true }
)

このメソッドは非推奨です。updateOne(), updateMany(), replaceOne() を使用してください。

db.collection.findAndModify(query, sort, remove, update, new, fields, upsert, ...)ドキュメントを検索し、それを変更または削除してから、元のドキュメントまたは変更後のドキュメントをアトミックに返します。非常に多機能ですが、複雑です。
// 'processed' フィールドが false の最も古い (ts 昇順) ドキュメントを探し、
// 'processed' を true に更新し、更新後のドキュメントを返す
db.queue.findAndModify({ query: { processed: false }, sort: { ts: 1 }, update: { $set: { processed: true, processing_time: new Date() } }, new: true // 更新後のドキュメントを返す (デフォルトは false で更新前を返す)
})
// 'counter_name' が 'user_id' のカウンターを探し、値を 1増やし、更新後の値を返す
db.counters.findAndModify({ query: { counter_name: 'user_id' }, update: { $inc: { value: 1 } }, new: true, upsert: true // カウンターが存在しない場合は作成する
})
// 'status' が 'temporary' のドキュメントを検索し、削除して、削除されたドキュメントを返す
db.temp_files.findAndModify({ query: { status: 'temporary' }, remove: true
})

findOneAndUpdate(), findOneAndReplace(), findOneAndDelete() の方がより明確で推奨されます。

db.collection.findOneAndUpdate(filter, update, options)フィルタに一致する最初のドキュメントを検索し、更新して、更新前または更新後のドキュメントを返します。options には projection, sort, upsert, returnNewDocument (または returnOriginal) などが含まれます。
// status が "pending" のドキュメントを score の降順で探し、
// status を "processing" に更新し、更新前のドキュメントを返す
db.tasks.findOneAndUpdate( { status: "pending" }, { $set: { status: "processing", startTime: new Date() } }, { sort: { score: -1 }, returnOriginal: true } // MongoDB 3.2+ では returnDocument: "before"
)
// 上記と同じ操作で、更新後のドキュメントを返す (デフォルトは更新前)
db.tasks.findOneAndUpdate( { status: "pending" }, { $set: { status: "processing", startTime: new Date() } }, { sort: { score: -1 }, returnNewDocument: true } // MongoDB 3.2+ では returnDocument: "after"
)
db.collection.findOneAndReplace(filter, replacement, options)フィルタに一致する最初のドキュメントを検索し、指定されたドキュメントで置き換えて、置換前または置換後のドキュメントを返します。optionsfindOneAndUpdate と同様です。
// sessionId が "abc" のセッションデータを新しいデータで置き換え、
// 置換後のドキュメントを返す。なければ挿入する (upsert)。
db.sessions.findOneAndReplace( { sessionId: "abc" }, { sessionId: "abc", userId: "user1", data: { theme: "light" }, expires: new Date(...) }, { upsert: true, returnNewDocument: true } // MongoDB 3.2+ では returnDocument: "after"
)

削除 (Delete)

メソッド説明使用例
db.collection.deleteOne(filter, options)フィルタ条件に一致する最初のドキュメントを削除します。
// name が "Bob" の最初のユーザーを削除
db.users.deleteOne({ name: "Bob" })
// status が "inactive" で lastLogin が特定の日付より前の最初のドキュメントを削除
db.users.deleteOne({ status: "inactive", lastLogin: { $lt: new Date("2023-01-01") } })
db.collection.deleteMany(filter, options)フィルタ条件に一致するすべてのドキュメントを削除します。注意: フィルタを空 ({}) にすると、コレクション内のすべてのドキュメントが削除されます。
// city が "Paris" の全てのユーザーを削除
db.users.deleteMany({ city: "Paris" })
// logs コレクションから、timestamp が特定の日付より古い全てのログを削除
db.logs.deleteMany({ timestamp: { $lt: new Date("2024-01-01T00:00:00Z") } })
// コレクションの全ドキュメントを削除 (通常は drop() の方が効率的)
db.temporaryData.deleteMany({})
db.collection.remove(query, optionsOrJustOne)古い削除メソッド。デフォルトでは条件に一致するすべてのドキュメントを削除します。単一のドキュメントのみを削除するには justOne: true (またはオプションオブジェクトの代わりに true) を指定します。
// status が "cancelled" の全ての注文を削除 (非推奨)
db.orders.remove({ status: "cancelled" })
// type が "spam" の最初のコメントを削除 (非推奨)
db.comments.remove({ type: "spam" }, true)
// または
db.comments.remove({ type: "spam" }, { justOne: true })

このメソッドは非推奨です。deleteOne() または deleteMany() を使用してください。

db.collection.findOneAndDelete(filter, options)フィルタに一致する最初のドキュメントを検索し、削除して、削除されたドキュメントを返します。options には projection, sort などが含まれます。
// status が "ready" のタスクを優先度 (priority) の高い順に探し、
// 最初のタスクを削除して、その内容 (jobId フィールドのみ) を返す
db.jobQueue.findOneAndDelete( { status: "ready" }, { sort: { priority: -1 }, projection: { jobId: 1, _id: 0 } }
)

インデックス操作

クエリのパフォーマンスを向上させるためのインデックスの作成、表示、削除に関する操作です。

メソッド説明使用例
db.collection.createIndex(keys, options)指定されたフィールドにインデックスを作成します。keys にはフィールド名とインデックスの方向 (1: 昇順, -1: 降順) を指定します。options でインデックス名、ユニーク制約、TTL (Time-To-Live) などを設定できます。
// userId フィールドに昇順インデックスを作成
db.users.createIndex({ userId: 1 })
// email フィールドにユニーク制約付きの昇順インデックスを作成 (バックグラウンドで実行)
db.users.createIndex({ email: 1 }, { unique: true, background: true })
// lastName 昇順、firstName 降順の複合インデックスを作成し、インデックス名を指定
db.users.createIndex({ lastName: 1, firstName: -1 }, { name: "name_index" })
// createdAt フィールドに TTL インデックスを作成 (ドキュメントが 1 時間後に自動削除される)
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
// location フィールドに 2dsphere インデックスを作成 (地理空間クエリ用)
db.places.createIndex({ location: "2dsphere" })
// description フィールドにテキストインデックスを作成 (全文検索用)
db.articles.createIndex({ title: "text", content: "text" })
db.collection.getIndexes()コレクションに存在するすべてのインデックスの情報を配列として返します。
db.users.getIndexes()
db.collection.dropIndex(index)指定されたインデックスを削除します。インデックスは名前 (文字列) またはキードキュメントで指定します。
// 名前でインデックスを削除
db.users.dropIndex("email_1") // email フィールドの昇順インデックス (デフォルト名)
// 名前でインデックスを削除 (カスタム名)
db.users.dropIndex("name_index")
// キードキュメントでインデックスを削除
db.users.dropIndex({ userId: 1 })
db.collection.dropIndexes()コレクションの _id インデックスを除く、すべてのインデックスを削除します。
// users コレクションの _id 以外の全インデックスを削除
db.users.dropIndexes()
db.collection.reIndex()コレクションのすべてのインデックスを再構築します。通常、ディスク容量の回収やパフォーマンス問題の解決のために使用されますが、時間がかかる可能性があります。
db.largeCollection.reIndex()

この操作はコレクションをロックする可能性があり、通常はメンテナンスウィンドウでの実行が推奨されます。

db.collection.totalIndexSize()コレクションのすべてのインデックスがディスク上で占める合計サイズ(バイト単位)を返します。
db.users.totalIndexSize()

集計 (Aggregation) フレームワーク

複数のドキュメントを処理し、計算された結果を返すための強力なフレームワークです。パイプライン形式で複数のステージ ($match, $group, $sort, $project など) を連結して使用します。

主な集計パイプラインステージ:

  • $match: ドキュメントをフィルタリングします (find() のクエリと同様)。パイプラインの早い段階で使用すると効率的です。
  • $group: 指定したキーでドキュメントをグループ化し、各グループに対して集計処理 (合計、平均、最大、最小など) を行います。
  • $project: 出力ドキュメントのフィールド reshaping (選択、除外、名前変更、計算フィールド追加) を行います。
  • $sort: ドキュメントをソートします。
  • $limit: パイプラインを通過するドキュメント数を制限します。
  • $skip: 指定された数のドキュメントをスキップします。
  • $unwind: 配列フィールドの各要素を個別のドキュメントとして展開します。
  • $lookup: 別のコレクションと結合 (LEFT OUTER JOIN に似た操作) を行います。
  • $out: パイプラインの結果を新しいコレクションに出力します。
  • $merge: パイプラインの結果を既存または新しいコレクションにマージ (挿入、更新、置換) します。
  • $addFields / $set: ドキュメントに新しいフィールドを追加または上書きします ($set$addFields のエイリアス)。
  • $count: パイプラインのそのステージに到達したドキュメント数をカウントし、指定された名前のフィールドに格納します。
  • $sortByCount: 指定されたフィールドの値でグループ化し、各値の出現回数をカウントして、カウント数の降順でソートします。
メソッド/ステージ説明使用例
db.collection.aggregate(pipeline, options)集計パイプラインを実行します。pipeline はステージオブジェクトの配列です。
// 各都市 (city) ごとのユーザー数を計算し、ユーザー数が多い順にソート
db.users.aggregate([ { $group: { _id: "$city", count: { $sum: 1 } } }, { $sort: { count: -1 } }
])
// status が "A" の注文について、顧客 (cust_id) ごとの合計金額 (totalAmount) を計算
db.orders.aggregate([ { $match: { status: "A" } }, { $group: { _id: "$cust_id", totalAmount: { $sum: "$amount" } } }
])
// 各商品の平均価格、最高価格、最低価格を計算
db.products.aggregate([ { $group: { _id: null, // 全てのドキュメントを一つのグループに avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" }, minPrice: { $min: "$price" } } }
])
// タグ配列を展開し、各タグの出現回数をカウント
db.articles.aggregate([ { $unwind: "$tags" }, { $group: { _id: "$tags", count: { $sum: 1 } } }, { $sort: { count: -1 } }
])
// orders コレクションと products コレクションを productId で結合
db.orders.aggregate([ { $lookup: { from: "products", // 結合するコレクション localField: "productId", // orders コレクションのフィールド foreignField: "prod_id", // products コレクションのフィールド as: "productDetails" // 結合結果を格納するフィールド名 } }
])
// 集計結果を新しいコレクション 'city_user_counts' に出力
db.users.aggregate([ { $group: { _id: "$city", count: { $sum: 1 } } }, { $out: "city_user_counts" }
])
// 2023 年以降の注文について、月ごとに合計売上を計算し、
// 結果を 'monthly_sales' コレクションにマージ (月が存在すれば更新、なければ挿入)
db.orders.aggregate([ { $match: { orderDate: { $gte: new Date("2023-01-01") } } }, { $group: { _id: { $dateToString: { format: "%Y-%m", date: "$orderDate" } }, // "YYYY-MM" 形式 totalSales: { $sum: "$amount" } } }, { $sort: { _id: 1 } }, { $merge: { into: "monthly_sales", on: "_id", // _id フィールド (月) でマッチング whenMatched: "replace", // マッチしたらドキュメントを置き換える whenNotMatched: "insert" // マッチしなかったら挿入する } }
])
Explain() (集計用)集計パイプラインの実行計画を表示します。パフォーマンスチューニングに役立ちます。aggregate() の後ろに付けます。
db.users.aggregate([ { $match: { status: "active" } }, { $group: { _id: "$department", count: { $sum: 1 } } }
]).explain("executionStats") // "queryPlanner", "executionStats", "allPlansExecution"

ユーザーとロール管理

データベースへのアクセス制御を行うためのユーザー作成、ロール割り当て、権限管理に関する操作です。通常、admin データベースで実行しますが、特定のデータベースに対してユーザーを作成することも可能です。

認証が有効になっている必要があります。

コマンド/メソッド説明使用例
db.createUser(user, writeConcern)新しいユーザーを作成します。ユーザー名、パスワード、所属するデータベースとロールを指定します。
// admin データベースに管理者ユーザーを作成
use admin
db.createUser({ user: "myAdmin", pwd: passwordPrompt(), // シェルがパスワード入力を求める roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})
// myAppDb データベースに読み取り専用ユーザーを作成
use myAppDb
db.createUser({ user: "appReader", pwd: "securePassword123", roles: [ { role: "read", db: "myAppDb" } ]
})
// myAppDb データベースに読み書きユーザーを作成
use myAppDb
db.createUser({ user: "appWriter", pwd: passwordPrompt(), roles: [ "readWrite" ] // db が指定されない場合、現在のデータベース (myAppDb) が対象
})
db.updateUser(username, update, writeConcern)既存のユーザー情報を更新します。パスワード変更、ロールの追加/削除、カスタムデータの更新などが可能です。
// appWriter ユーザーのパスワードを変更 (myAppDb で実行)
use myAppDb
db.updateUser("appWriter", { pwd: passwordPrompt() })
// appWriter ユーザーに backup ロールを追加 (admin DB のロール)
use myAppDb
db.updateUser("appWriter", { $push: { roles: { role: "backup", db: "admin" } }
})
// myAdmin ユーザーのカスタムデータを更新 (admin DB で実行)
use admin
db.updateUser("myAdmin", { $set: { customData: { employeeId: "E12345" } }
})
db.changeUserPassword(username, password, writeConcern)ユーザーのパスワードを変更するための専用メソッドです。updateUser でも可能ですが、こちらの方が意図が明確です。
// appReader ユーザーのパスワードを変更 (myAppDb で実行)
use myAppDb
db.changeUserPassword("appReader", passwordPrompt())
db.dropUser(username, writeConcern)指定したユーザーを現在のデータベースから削除します。
// appWriter ユーザーを myAppDb から削除
use myAppDb
db.dropUser("appWriter")
db.dropAllUsers(writeConcern)現在のデータベースからすべてのユーザーを削除します。注意: 非常に危険な操作です。
// myAppDb から全ユーザーを削除 (実行前に要確認!)
use myAppDb
// db.dropAllUsers() // コメントアウト解除して実行
db.getUser(username, args)指定したユーザーの詳細情報を取得します。
// myAdmin ユーザーの情報を取得 (admin DB で実行)
use admin
db.getUser("myAdmin")
// appReader ユーザーの情報をロール情報も含めて取得 (myAppDb で実行)
use myAppDb
db.getUser("appReader", { showPrivileges: true })
db.getUsers(filter)現在のデータベースに定義されているユーザーのリストを取得します。
// 現在のデータベース (例: myAppDb) の全ユーザーを取得
use myAppDb
db.getUsers()
// admin データベースの全ユーザーを取得
use admin
db.getUsers()
db.createRole(role, writeConcern)カスタムロールを作成します。ロール名、継承するロール、実行可能な権限 (privileges) を定義します。
// myAppDb でアイテム管理用ロールを作成 (admin DB で実行 or myAppDb で実行)
use myAppDb // または use admin
db.createRole({ role: "itemManager", privileges: [ { resource: { db: "myAppDb", collection: "items" }, actions: [ "find", "update", "insert" ] }, { resource: { db: "myAppDb", collection: "inventory" }, actions: [ "find" ] } ], roles: [] // 他のロールを継承しない場合
})
db.updateRole(rolename, update, writeConcern)既存のカスタムロールを更新します。権限の追加/削除、継承ロールの変更などが可能です。
// itemManager ロールに inventory コレクションへの insert 権限を追加 (myAppDb で実行)
use myAppDb
db.updateRole("itemManager", { $push: { privileges: { resource: { db: "myAppDb", collection: "inventory" }, actions: [ "insert" ] } }
})
db.dropRole(rolename, writeConcern)指定したカスタムロールを現在のデータベースから削除します。
// itemManager ロールを myAppDb から削除
use myAppDb
db.dropRole("itemManager")
db.dropAllRoles(writeConcern)現在のデータベースからすべてのユーザー定義ロールを削除します。注意: 組み込みロールは削除されません。
// myAppDb から全カスタムロールを削除
use myAppDb
db.dropAllRoles()
db.getRole(rolename, args)指定したロールの詳細情報を取得します。
// itemManager ロールの情報を権限も含めて取得 (myAppDb で実行)
use myAppDb
db.getRole("itemManager", { showPrivileges: true })
// 組み込みロール readWrite の情報を取得 (任意の DB で可)
db.getRole("readWrite", { showPrivileges: true, showBuiltinRoles: true })
db.getRoles(filter)現在のデータベースに定義されているロールのリストを取得します。showBuiltinRoles: true で組み込みロールも表示できます。
// 現在のデータベース (例: myAppDb) の全カスタムロールを取得
use myAppDb
db.getRoles()
// 現在のデータベースの全ロール (カスタム + 組み込み) を取得
use myAppDb
db.getRoles({ showBuiltinRoles: true })
db.grantRolesToUser(username, roles, writeConcern)既存のユーザーにロールを追加します。
// appReader ユーザーに itemManager ロールを追加 (myAppDb で実行)
use myAppDb
db.grantRolesToUser("appReader", [ "itemManager" ]) // ロール名のみ、現在のDBのロール
// または
db.grantRolesToUser("appReader", [ { role: "itemManager", db: "myAppDb" } ])
db.revokeRolesFromUser(username, roles, writeConcern)ユーザーからロールを削除します。
// appReader ユーザーから itemManager ロールを削除 (myAppDb で実行)
use myAppDb
db.revokeRolesFromUser("appReader", [ "itemManager" ])
// または
db.revokeRolesFromUser("appReader", [ { role: "itemManager", db: "myAppDb" } ])
db.grantPrivilegesToRole(rolename, privileges, writeConcern)既存のカスタムロールに権限を追加します。
// itemManager ロールにログコレクションへの find 権限を追加 (myAppDb で実行)
use myAppDb
db.grantPrivilegesToRole("itemManager", [ { resource: { db: "myAppDb", collection: "logs" }, actions: [ "find" ] }
])
db.revokePrivilegesFromRole(rolename, privileges, writeConcern)カスタムロールから権限を削除します。
// itemManager ロールから inventory コレクションへの insert 権限を削除 (myAppDb で実行)
use myAppDb
db.revokePrivilegesFromRole("itemManager", [ { resource: { db: "myAppDb", collection: "inventory" }, actions: [ "insert" ] }
])
db.auth(username, password)現在のデータベースに対してユーザー認証を行います。mongo コマンドで接続時に認証情報を指定しなかった場合などに使用します。
// appReader として myAppDb に認証
use myAppDb
db.auth("appReader", "securePassword123")
// またはパスワードプロンプトを使用
db.auth("appReader", passwordPrompt())
db.logout()現在の接続の認証セッションを終了します。
db.logout()

レプリカセット/シャーディング関連

レプリカセットやシャーディングクラスタの状態確認や管理に関連する基本的なコマンドです。詳細な設定や管理は専用のコマンドやメソッドを使用します。

コマンド/メソッド説明使用例
rs.status()接続しているレプリカセットの状態を表示します。メンバーの状態 (PRIMARY, SECONDARY, ARBITER など)、ヘルス、同期遅延などの情報が含まれます。mongod がレプリカセットのメンバーである場合にのみ有効です。
rs.status()
rs.conf()レプリカセットの設定オブジェクトを表示します。メンバーのホスト名、優先度、投票権などの設定が含まれます。
rs.conf()
rs.initiate(config)新しいレプリカセットを初期化します。引数に設定オブジェクトを指定します。通常、最初のメンバーで一度だけ実行します。
// 単純な3メンバー構成で初期化 (例)
var config = { _id: "myReplicaSet", members: [ { _id: 0, host: "mongo1.example.com:27017" }, { _id: 1, host: "mongo2.example.com:27017" }, { _id: 2, host: "mongo3.example.com:27017" } ]
};
rs.initiate(config);
rs.add(hostport, arbiterOnly)既存のレプリカセットに新しいメンバーを追加します。hostport は “hostname:port” 形式の文字列です。arbiterOnly を true にするとアービターとして追加します。
// 新しいデータノードを追加
rs.add("mongo4.example.com:27017")
// 新しいアービターを追加
rs.add("arbiter1.example.com:27017", true)
rs.remove(hostport)レプリカセットからメンバーを削除します。
rs.remove("mongo4.example.com:27017")
rs.reconfig(config, force)レプリカセットの設定を更新します。rs.conf() で取得した設定を変更して渡します。force: true は現在のプライマリが設定内のメンバーと一致しない場合に強制的に再設定しますが、危険な場合があります。
// 設定を取得して変更し、再設定
var cfg = rs.conf();
// cfg の内容を変更 (例: メンバーの優先度変更など)
// cfg.members[1].priority = 2;
rs.reconfig(cfg);
rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)現在のプライマリノードに、自発的にプライマリを辞任させ、セカンダリに降格させます。これにより新しいプライマリが選出されます。メンテナンスなどに使用します。
// 60秒間プライマリにならないようにして降格
rs.stepDown(60)
rs.freeze(secs)指定された秒数間、現在のノードがプライマリに選出されるのを防ぎます。
// 120秒間プライマリにならないようにする
rs.freeze(120)
rs.syncFrom(hostport)現在のセカンダリノードが、指定された他のレプリカセットメンバーからデータを同期するように指示します。同期ソースを手動で変更する場合に使用します。
// mongo2.example.com:27017 から同期する
rs.syncFrom("mongo2.example.com:27017")
sh.status(verbose)シャーディングクラスタの状態を表示します。シャード情報、バランサーの状態、チャンク情報などが含まれます。mongos プロセスに接続している場合にのみ有効です。verbose: true で詳細情報を表示します。
sh.status()
sh.status(true) // 詳細表示
sh.addShard(shardURL, name)シャーディングクラスタに新しいシャードを追加します。shardURL はレプリカセット名/ホスト:ポート形式 (例: “rs0/mongo1:27018,mongo2:27018”) またはスタンドアロンインスタンスのホスト:ポート形式です。
// レプリカセット rs1 をシャードとして追加
sh.addShard("rs1/mongo-rs1-1:27018,mongo-rs1-2:27018")
// スタンドアロンインスタンスをシャードとして追加 (非推奨)
sh.addShard("mongo-sa:27019", "shardStandalone")
sh.enableSharding(database)指定したデータベースに対してシャーディングを有効にします。
// myBigDb データベースのシャーディングを有効にする
sh.enableSharding("myBigDb")
sh.shardCollection(namespace, key, unique, options)指定したコレクションをシャーディングします。namespace は “database.collection” 形式、key はシャードキーを指定するドキュメントです。
// myBigDb.users コレクションを userId フィールドでシャーディング (ハッシュベース)
sh.shardCollection("myBigDb.users", { userId: "hashed" })
// myBigDb.orders コレクションを orderId フィールドでシャーディング (レンジベース)
sh.shardCollection("myBigDb.orders", { orderId: 1 })
// 複合シャードキーでシャーディング
sh.shardCollection("myBigDb.events", { customerId: 1, eventTimestamp: 1 })
sh.removeShard(shardName)クラスタからシャードを削除するプロセスを開始します。シャード内のデータが他のシャードに移動 (ドレイン) されるため、時間がかかります。
// shard0001 シャードの削除プロセスを開始
sh.removeShard("shard0001")

シャードの削除は複雑なプロセスです。removeShard コマンドは削除を開始するだけで、完了までにはチャンクの移動が必要です。sh.status() で進行状況を確認します。

sh.startBalancer(timeout, interval) / sh.stopBalancer(timeout)チャンクバランサーを開始または停止します。バランサーはシャード間でチャンクを自動的に移動させ、データ分散を均等に保ちます。
// バランサーを開始
sh.startBalancer()
// バランサーを停止 (60000ms=1分 待機)
sh.stopBalancer(60000)
sh.getBalancerState() / sh.isBalancerRunning()チャンクバランサーが現在有効かどうか、実行中かどうかを確認します。
sh.getBalancerState()
sh.isBalancerRunning()
sh.moveChunk(namespace, query, toShard)指定した名前空間 (コレクション) の特定のチャンクを手動で別のシャードに移動します。query はチャンク内の一意なドキュメントを特定するための条件、toShard は移動先のシャード名です。
// myBigDb.users コレクションで userId が 100 のドキュメントを含むチャンクを shard0002 に移動
sh.moveChunk("myBigDb.users", { userId: 100 }, "shard0002")

通常、チャンクの移動はバランサーに任せるべきです。手動での移動は特別な場合に限られます。

その他便利なコマンド

上記カテゴリに含まれない、診断や情報取得に役立つコマンドです。

コマンド/メソッド説明使用例
db.collection.explain(verbosity)クエリ (find, update, remove, aggregate など) の実行計画を表示します。インデックスの使用状況やパフォーマンスボトルネックの特定に不可欠です。verbosity には “queryPlanner”, “executionStats”, “allPlansExecution” を指定できます。
// find クエリの実行計画 (インデックス使用状況など)
db.users.find({ city: "New York", age: { $gt: 30 } }).explain()
// find クエリの実行統計情報 (実行時間、スキャンしたドキュメント数など)
db.users.find({ city: "New York" }).sort({ name: 1 }).explain("executionStats")
// update クエリの実行計画
db.products.updateMany({ inStock: false }, { $set: { status: "discontinued" } }).explain()
db.currentOp(arg)現在 MongoDB インスタンスで実行中の操作に関する情報を表示します。長時間実行されているクエリやロック競合の調査に役立ちます。
// 現在実行中の全ての操作を表示
db.currentOp()
// アクティブな操作のみを表示
db.currentOp(true)
// または
db.currentOp({ "active": true })
// 特定のコレクションに対する操作を表示
db.currentOp({ "ns": "myDb.myCollection" })
// 10秒以上実行されている操作を表示
db.currentOp({ "secs_running": { $gt: 10 } })
db.killOp(opid)指定された操作 ID (opid) の操作を強制終了します。db.currentOp()opid を確認できます。注意: 実行中の操作を中断させるため、慎重に使用してください。
// opid が 12345 の操作を終了
db.killOp(12345)
db.setProfilingLevel(level, slowms)データベースプロファイラのレベルを設定します。
  • 0: オフ
  • 1: 遅い操作 (slowms より時間がかかった操作) のみを記録
  • 2: すべての操作を記録
slowms はミリ秒単位の閾値です (デフォルト 100ms)。プロファイル結果は system.profile コレクションに記録されます。
// 50ms より遅い操作をプロファイル
db.setProfilingLevel(1, 50)
// すべての操作をプロファイル
db.setProfilingLevel(2)
// プロファイリングを無効化
db.setProfilingLevel(0)
db.getProfilingStatus()現在のプロファイリングレベルと閾値 (slowms) を表示します。
db.getProfilingStatus()
db.system.profile.find()プロファイラによって記録された情報を表示します (プロファイリングが有効な場合)。
// プロファイル結果を表示
db.system.profile.find().pretty()
// 遅いクエリ (type: "query", millis > 100) を表示
db.system.profile.find({ op: "query", millis: { $gt: 100 } }).sort({ ts: -1 })

system.profile は Capped Collection です。古いデータは自動的に削除されます。

db.setSecondaryOk() / rs.secondaryOk()現在の接続でセカンダリノードからの読み取りを許可します。デフォルトではプライマリからのみ読み取ります。レプリカセット環境で使用します。
// 現在の接続でセカンダリからの読み取りを許可
db.setSecondaryOk()
// または
rs.secondaryOk()
ObjectId()新しい ObjectId を生成します。ドキュメントの _id のデフォルト値です。
// 新しい ObjectId を生成
var newId = ObjectId()
print(newId)
// 特定の ObjectId を持つドキュメントを検索
db.myCollection.findOne({ _id: ObjectId("605c7d7b8f8d7a001f2b3c4d") })
ISODate()ISO 8601 形式の日付文字列から Date オブジェクトを生成します。日付/時刻のクエリや挿入に便利です。
// 現在の日時で Date オブジェクトを生成
var now = ISODate()
print(now)
// 特定の日時で Date オブジェクトを生成
var specificDate = ISODate("2024-03-15T10:30:00Z")
db.events.insertOne({ event: "meeting", time: specificDate })
// 特定の日付より後のドキュメントを検索
db.logs.find({ timestamp: { $gt: ISODate("2024-01-01T00:00:00Z") } })

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です