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 \
mongoVolume マウント付き:
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 | 重複なしで配列に値を追加 |