MongoDB (mongosh) チートシート
mongosh を素早く参照:接続、CRUD、クエリ演算子、集約パイプライン、インデックス、レプリカ セット、ユーザ、ダンプ / リストア — よく使うシェル パターンと実用例をまとめました。
30 コマンド
接続 / メタ
mongosh "<uri>"標準的な接続 URI で MongoDB に接続します。
--quiet; --eval 'cmd'; --file script.js; --apiVersion 1/2
mongosh "mongodb://app:[email protected]:27017/app_production?authSource=admin"show dbs / use <db> / show collectionsDB を一覧 / 切替 / 現在の DB のコレクションを一覧。
show dbs | use app | show collectionsdb.serverStatus() / db.stats()サーバ情報:接続、opcounters、レプリケーション状態;db 統計:サイズとコレクション。
.pretty() で整形; .verbose(); .json; --eval 結果
db.serverStatus().connections && db.stats().dataSizeCRUD: Read
db.<coll>.find()コレクションを検索;.pretty() .limit() .skip() .sort() を繋げて結果を整形。
.projection({name:1, email:1, _id:0}); .sort({createdAt:-1}); .limit(20); .skip(20); .count(); .allowDiskUse()
db.orders.find({status:'paid', amount:{$gte:10}}).sort({createdAt:-1}).limit(20).pretty()db.<coll>.findOne({...}) / db.<coll>.countDocuments({...})ドキュメントを 1 件読み取り、またはフィルタ一致の件数を取得。
findOne はフィルタ有 / 無;estimatedDocumentCount は O(1)
db.users.findOne({email:'[email protected]'}, {pwd:0, _id:0}) && db.orders.countDocuments({status:'paid'})CRUD: Create
db.<coll>.insertOne({...}) / insertMany([...])ドキュメントを 1 件 / 複数挿入;ordered:false で一部失敗時も有効な分すべて書込。
db.logs.insertMany([{k:'api', t:new Date()}, {k:'worker', t:new Date()}], {ordered:false})CRUD: Update
db.<coll>.updateOne(filter, update, opts)ドキュメントを 1 件更新。$set $inc $push $pull $addToSet $rename $unset などの演算子を使用。
upsert:true; ネスト配列は arrayFilters:[]; returnDocument:'after'(findOneAndUpdate)
db.users.updateOne({email:'[email protected]'}, {$inc:{loginCount:1}, $set:{lastSeen:new Date()}}, {upsert:true})db.<coll>.updateMany(filter, update) / findOneAndUpdate複数ドキュメントを一括更新;findOneAndUpdate は更新前後ドキュメントをアトミックに返します。
db.orders.updateMany({status:'pending', createdAt:{$lt:new Date(Date.now()-864e5)}}, {$set:{status:'cancelled'}})CRUD: Replace
db.<coll>.replaceOne(filter, replacement)_id(置換対象に指定不可)を除き、ドキュメント全体を置換します。
db.users.replaceOne({email:'[email protected]'}, {name:'Alice', email:'[email protected]', role:'admin', tags:['vip']})CRUD: Delete
db.<coll>.deleteOne / deleteMany(filter)条件に一致するドキュメントを削除。deleteMany({}) で全件削除(注意)。
db.sessions.deleteMany({lastSeen:{$lt:new Date(Date.now()-7*864e5)}}) && db.orders.deleteOne({_id:ObjectId('...')})クエリ演算子
比較: $eq / $ne / $gt / $gte / $lt / $lte / $in / $nin標準的な比較演算子;$in は値のリストにマッチ。
db.orders.find({amount:{$gte:10,$lt:100}, status:{$in:['paid','shipped']}})論理: $and / $or / $not / $nor述語の組合せ;$not は正規表現 / メタデータ専用、正規表現は明示指定が必要。
db.products.find({$or:[{sale:true,price:{$lt:50}},{tags:'vip'}]})$exists / $type / $regex / $expr / $modフィールド単位の述語:存在、BSON 型、正規表現、集約内比較($expr)、$mod。
db.users.find({email:{$exists:true, $regex:'@example.com$', $options:'i'}})db.<coll>.distinct(field, filter)フィールドの固有値を取得(任意でフィルタ付き)。
db.orders.distinct('userId', {status:'paid'}).length集約
.aggregate([...])パイプライン ステージを組立:$match → $group → $project → $sort → $limit → $lookup → $unwind → $facet。
.explain('executionStats'); allowDiskUse:true; collation ドキュメント
db.orders.aggregate([ { $match:{status:'paid'} }, { $group:{_id:'$userId', gmv:{$sum:'$amount'}, n:{$sum:1}} }, { $sort:{gmv:-1} }, { $limit:50} ])$lookup / $graphLookupコレクション間の結合($lookup)、再帰的なツリー走査($graphLookup)。
db.orders.aggregate([{$lookup:{from:'users', localField:'userId', foreignField:'_id', as:'user'}}, {$unwind:'$user'}, {$project:{total:1, 'user.name':1}}])$bucket / $bucketAuto / $sample / $sortByCount便利な集約:バケット化、サンプリング、Top N カウント。
db.events.aggregate([{$sample:{size:100}}, {$group:{_id:'$kind', n:{$sum:1}}}])インデックス
db.<coll>.createIndex(spec, opts)単一 / 複合 / 地理空間 / テキスト / TTL インデックスを作成。
{unique:true, partialFilterExpression, sparse, expireAfterSeconds, weights, name}
db.users.createIndex({email:1}, {unique:true}) && db.events.createIndex({ts:1}, {expireAfterSeconds:7*86400}) && db.shops.createIndex({loc:'2dsphere'})db.<coll>.getIndexes() / dropIndex / dropIndexesインデックス一覧;1 件 / 全件の削除(本番で気軽に実行しないこと)。
db.users.getIndexes().forEach(i=>print(i.name, JSON.stringify(i.key)))db.<coll>.explain('executionStats').find(filter)勝者プランと実際の実行統計を確認。COLLSCAN、IXSCAN、FETCH、ソート ステージを探す。
executionStats / queryPlanner / allPlansExecution; verbosity
db.orders.find({userId:42,createdAt:{$gte:new Date('2026-01-01')}}).sort({createdAt:-1}).explain('executionStats').queryPlanner.winningPlandb.<coll>.hint({...})プランナに特定インデックスを使用させる — 不良プランや回帰のデバッグ用。
db.users.find({email:'[email protected]'}).hint({email:1}).explain()メンテナンス
db.runCommand({...}) / db.adminCommand / db.commandMongoDB コマンドを直接実行。シェル ヘルパにない操作用の抜け道。
db.runCommand({listCollections:1, name:'app'}) && db.adminCommand({listDatabases:1}).databases.lengthdb.revokeRolesFromUser / grantRolesToUserロール管理(admin DB で実行)。
use admin; db.createUser({user:'audit',pwd:'...',roles:[{role:'readAnyDatabase',db:'admin'}]})レプリカ セット
rs.initiate() / rs.status()シングル ノード レプリカ セットを起動;健全性を表示。
rs.initiate({_id:'rs0',members:[{_id:0,host:'m1:27017'}]}); rs.status().myState
rs.initiate({_id:'rs0',members:[{_id:0,host:'m1:27017'},{_id:1,host:'m2:27017'},{_id:2,host:'m3:27017'}]})rs.add / rs.remove / rs.stepDownメンバ追加 / 削除;フェイルオーバ試験のため選挙を強制。
rs.add('m4:27017'); rs.remove('m3:27017'); rs.stepDown(60)
rs.add('m4.internal:27017') && rs.stepDown(60) && sh.status() on the next memberシャード クラスタ
sh.status() / sh.enableShardingクラスタ トポロジの確認 / DB に対するシャーディング有効化。
use admin; sh.enableSharding('analytics'); sh.shardCollection('analytics.events', {userId:1, ts:1})バックアップ / 移行
mongodump / mongorestore論理バックアップ / リストア。--uri、--db、--archive でストリーム;--gzip で圧縮。
--gzip; --archive=file.archive; --oplog でポイント イン タイム; --nsInclude/Exclude
mongodump --uri="mongodb://user:pw@m1:27017/?authSource=admin" --gzip --archive=/backup/app-2026-07-23.archive && mongorestore --gzip --archive=/backup/app.archive --nsInclude='app.*' --dropmongoexport / mongoimportJSON / CSV のエクスポート / インポート。Mongo と他システムを結ぶパイプ役として使えます。
--type=json|csv; --fields=a,b,c; --headerline; -q フィルタ; --jsonArray(単一トップレベル配列)
mongoexport --uri="..." -d app -c orders --type=json -q '{"status":"paid"}' --out=orders.json && mongoimport --drop --jsonArray orders.json -d copy -c ordersmongotop / mongostatライブ監視:直前 1 秒間のコレクション別 read / write 時間、統計情報。
interval(秒); --host
mongostat --host=m1.internal --authdb=admin --username=ops -i 5db.shutdownServer()mongod を綺麗に停止するため admin DB で実行 — rm / 電源断からの復旧にも便利。
use admin; db.shutdownServer({force:true}? は不可); クリーンは oplog レプリケーションを待機
use admin; db.shutdownServer()チートシート バージョン 1.0.0
MongoDB 6.0+ / mongosh 1.6+ に対応