MongoDB CLI

MongoDB Shell(mongosh)のよく使うコマンドリファレンス。

Docker 環境

コンテナ起動

docker run -d --name testMongoDB \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=password \
  -p 27017:27017 \
  mongo

Volume マウント付き:

docker run -d --name mongodb \
  -p 27017:27017 \
  -v "D:/DatabaseMount/Mongo":/data/db \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=admin \
  mongo:latest

コンテナに入る

docker exec -it CONTAINER_ID bash
mongosh

基本操作

データベース操作

# すべてのデータベースを一覧表示
show dbs

# データベース切り替え/作成(存在しない場合、データ挿入後に自動作成)
use database

# 現在のデータベースを削除
db.dropDatabase()

Collection 操作

# すべての collections を一覧表示
show collections

# collection を作成
db.createCollection("students")

認証

db.auth("admin", "password")

ヘルプ表示

db.help()

ユーザー管理

createUser

db.createUser({
  user: "admin",
  pwd: "password",
  roles: [
    { role: "userAdminAnyDatabase", db: "admin" },
    "readWriteAnyDatabase"
  ]
})

特定データベースのユーザー作成:

db.createUser({
  user: "user1",
  pwd: "123456",
  roles: [{ role: "readWrite", db: "demo" }]
})

grantRolesToUser

db.grantRolesToUser(
  "demouser",
  [{ role: "readWrite", db: "demo" }]
)

CRUD 操作

Create

insertOne

collection が存在しない場合、MongoDB が自動作成:

db.students.insertOne({ name: "Spongebob", age: 30, gpa: 3.2 })

出力:

{
  "acknowledged": true,
  "insertedId": ObjectId("64fc64cd3d53295f6abd2856")
}

insertMany

db.students.insertMany([
  { name: "Patrick", age: 38, gpa: 1.5 },
  { name: "Sandy", age: 27, gpa: 4.0 },
  { name: "Gary", age: 18, gpa: 2.5 }
])

Read

find

すべてのドキュメントを取得:

db.students.find()

条件付きクエリ:

db.students.find({ age: 18 })

Projection(フィールド射影)

# name フィールドのみ返す(_id 含む)
db.students.find({}, { name: true })

# _id を除外
db.students.find({}, { _id: false, name: true })

count / limit / sort

# カウント
db.students.find().count()

# 件数制限
db.students.find().limit(2)

# ソート(1: 昇順, -1: 降順)
db.students.find().sort({ name: 1 })

Update

updateOne

db.students.updateOne(filter, update)

$set 演算子:フィールドが存在しなければ追加、存在すれば更新

db.students.updateOne(
  { name: "Spongebob" },
  { $set: { fullTime: true } }
)

_id を使用するとより安全:

db.students.updateOne(
  { _id: ObjectId("65000e5f94ba2fcc6d4f05df") },
  { $set: { fullTime: false } }
)

$unset 演算子:フィールドを削除

db.students.updateOne(
  { name: "Sandy" },
  { $unset: { fullTime: "" } }
)

updateMany

# すべてのドキュメントに fullTime フィールドを追加
db.students.updateMany({}, { $set: { fullTime: false } })

# fullTime フィールドがないドキュメントのみ更新
db.students.updateMany(
  { fullTime: { $exists: false } },
  { $set: { fullTime: true } }
)

update(旧式構文)

db.system.users.update(
  { "user": "user1" },
  { $set: { "user": "admin" } }
)

クエリ演算子

比較演算子

演算子説明
$gtより大きい
$gte以上
$ltより小さい
$lte以下
$eq等しい
$ne等しくない
$in指定配列に含まれる
$nin指定配列に含まれない

$gt(より大きい)

db.books.find({ rating: { $gt: 7 } })

$lt(より小さい)

db.books.find({ rating: { $lt: 8 } })

$lte(以下)

db.books.find({ rating: { $lte: 8 } })

論理演算子

演算子説明
$orまたは
$andかつ
$not否定
$norどちらでもない

$or 例

db.books.find({ $or: [{ rating: 7 }, { rating: 9 }] })

条件の組み合わせ:

db.books.find({
  $or: [
    { pages: { $lt: 300 } },
    { pages: { $gt: 400 } }
  ]
})

$in / $nin

# rating が 7, 8, 9 のいずれか
db.books.find({ rating: { $in: [7, 8, 9] } })

# rating が 7, 8, 9 以外
db.books.find({ rating: { $nin: [7, 8, 9] } })

その他の演算子

演算子説明
$existsフィールドが存在するか
$setフィールド値を設定
$unsetフィールドを削除

配列クエリ

特定の値を含む

# genres 配列に "fantasy" を含む
db.books.find({ genres: "fantasy" })

配列の完全一致

# genres 配列が「ちょうど」["fantasy"] のみ
db.books.find({ genres: ["fantasy"] })

# genres 配列が ["fantasy", "magic"](順序も一致)
db.books.find({ genres: ["fantasy", "magic"] })

$all(指定したすべての要素を含む)

# genres に "fantasy" と "sci-fi" を含む(順序不問)
db.books.find({ genres: { $all: ["fantasy", "sci-fi"] } })

ネストされたオブジェクト配列のクエリ

# reviews 配列に name が "Luigi" のオブジェクトを含む
db.books.find({ "reviews.name": "Luigi" })

Replica Set

初期化

rs.initiate({
  _id: "rs0",
  members: [{ _id: 0, host: "localhost:27017" }]
})

ステータス確認

rs.status()

出力例(一部):

{
  "set": "rs0",
  "myState": 1,
  "members": [
    {
      "_id": 0,
      "name": "localhost:27017",
      "health": 1,
      "state": 1,
      "stateStr": "PRIMARY"
    }
  ],
  "ok": 1
}

Aggregation Pipeline

アグリゲーションパイプラインは複雑なデータ分析と変換に使用されます。

よく使うステージ

ステージ説明
$matchドキュメントをフィルター(find に類似)
$groupグループ化と集計計算
$sortソート
$limit件数制限
$lookup関連クエリ(SQL JOIN に類似)
$projectフィールド射影
$unwind配列を展開

$match

db.order.aggregate([
  { $match: { _id: ObjectId("5968d724592e0a4141ea43e7") } }
])

$lookup(関連クエリ)

$lookup は概念的に SQL の JOIN 操作 に類似

db.order.aggregate([
  { $match: { _id: ObjectId("5968d724592e0a4141ea43e7") } },
  {
    $lookup: {
      from: "web",
      localField: "webId",
      foreignField: "_id",
      as: "webData"
    }
  }
])

$group

すべてのユーザーの平均年齢を計算:

db.users.aggregate([
  {
    $group: {
      _id: null,
      averageAge: { $avg: "$age" }
    }
  }
])

性別ごとに平均年齢を計算:

db.users.aggregate([
  {
    $group: {
      _id: "$gender",
      averageAge: { $avg: "$age" }
    }
  }
])

組み合わせ例:Top 5 人気フルーツ

db.users.aggregate([
  {
    $group: {
      _id: "$favoriteFruit",
      count: { $sum: 1 }
    }
  },
  { $sort: { count: -1 } },
  { $limit: 5 }
])

集計演算子

演算子説明
$sum合計
$avg平均値
$min最小値
$max最大値
$first最初の値
$last最後の値
$push配列に値を追加
$addToSet重複なしで配列に値を追加

関連トピック