MongoDB - コレクション
概要
MongoDBにおけるコレクション (Collection) は、ドキュメントの集合である。
リレーショナルデータベース管理システム (RDBMS) のテーブルに相当する。
MongoDBはスキーマレスのため、同じコレクション内のドキュメントが異なる構造を持つことができる。
ただし、スキーマ検証機能を使用することにより、ドキュメントの構造を制約することも可能である。
RDBMSとの用語対応
下表に、MongoDBとMySQLの用語対応を示す。
| MongoDB | MySQL | 説明 |
|---|---|---|
| コレクション | テーブル | ドキュメント / レコードの集合 |
| ドキュメント | レコード / 行 | データの単位 |
| フィールド | カラム | データの属性 |
| _id (自動生成) | 主キー | ドキュメントの一意識別子 |
コレクションの作成
基本的な作成方法
コレクションを作成するには、db.createCollection メソッドを使用する。
基本的な構文を以下に示す。
db.createCollection(name, {
capped: <boolean>,
size: <number>,
max: <number>,
validator: <document>,
validationLevel: <string>,
validationAction: <string>,
collation: <document>
})
簡単な作成例を以下に示す。
db.createCollection("users")
MongoDBでは、ドキュメントを挿入する時に、コレクションが存在しない場合は自動的に作成される。
db.users.insertOne({ name: "Alice", age: 30 })
既存コレクションの存在確認
コレクションが既に存在するかどうかを確認してから作成する場合は、以下の方法を使用する。
if (!db.getCollectionNames().includes("users")) {
db.createCollection("users")
}
コレクションのコピー
既存のコレクションをコピーする方法を以下に示す。
- aggregateメソッドと$outステージを使用する方法
db.source_collection.aggregate([ { $match: {} }, { $out: "destination_collection" } ])
- mongodumpとmongorestoreを使用する方法
mongodump --db mydb --collection source_collection mongorestore --db mydb --collection destination_collection dump/mydb/source_collection.bson
Capped Collection (固定サイズコレクション)
Capped Collectionは、固定サイズのコレクションであり、サイズまたはドキュメント数の上限に達すると、古いドキュメントが自動的に削除される。
ログやキャッシュ等の用途に適している。
Capped Collectionの作成例を以下に示す。
db.createCollection("logs", {
capped: true,
size: 5242880,
max: 5000
})
| パラメータ | 説明 |
|---|---|
capped |
true に設定すると、Capped Collectionとして作成される。
|
size |
コレクションの最大サイズ (バイト単位)。 |
max |
コレクションに保存できる最大ドキュメント数 (オプション) |
Time Series Collection (時系列コレクション)
Time Series Collectionは、時系列データ (センサーデータ、ログデータ等) を効率的に格納するためのコレクションである。
MongoDB 5.0以降で利用可能である。
Time Series Collectionの作成例を以下に示す。
db.createCollection("sensor_data", {
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "hours"
},
expireAfterSeconds: 86400
})
| パラメータ | 説明 |
|---|---|
timeField |
タイムスタンプを格納するフィールド名。 |
metaField |
メタデータを格納するフィールド名 (オプション) |
granularity |
データの粒度seconds、minutes、hours のいずれか
|
expireAfterSeconds |
データの有効期限 (秒単位) |
照合順序 (Collation)
照合順序とは
照合順序 (Collation) は、文字列の比較やソート時に使用される規則である。
言語固有の文字列比較ルール (大文字小文字の区別、アクセント記号の扱い等) を定義する。
下表に、照合順序の主なオプションを示す。
| オプション | 説明 |
|---|---|
locale |
必須項目である。 言語コード (例: ja、en、fr) |
strength |
比較の厳密さ (1〜5) 1は基本文字のみを比較し、5は全ての違いを考慮する。 |
caseLevel |
大文字小文字を区別するかどうかtrue または false
|
numericOrdering |
数値文字列を数値として比較するかどうかtrue または false
|
照合順序の指定
コレクション作成時に照合順序を指定する例を以下に示す。
db.createCollection("products", {
collation: {
locale: "ja",
strength: 1,
caseLevel: false,
numericOrdering: true
}
})
使用可能な照合順序の確認
MongoDBでサポートされているロケールは、ICU (International Components for Unicode) ライブラリに基づいている。
一般的な言語コードには、ja (日本語)、en (英語)、fr (フランス語) 等がある。
既存コレクションの照合順序の確認
コレクションの照合順序を確認するには、以下のコマンドを使用する。
db.getCollectionInfos({ name: "products" })
既存コレクションの照合順序の変更
既存のコレクションの照合順序を変更するには、collModコマンドを使用する。
db.runCommand({
collMod: "products",
collation: {
locale: "en",
strength: 2
}
})
コレクションの削除
単一コレクションの削除
コレクションを削除するには、drop メソッドを使用する。
db.users.drop()
削除が成功した場合は true が返され、失敗した場合は false が返される。
複数コレクションの削除
複数のコレクションを削除する場合、以下に示すようにループを使用する。
var collections = ["collection1", "collection2", "collection3"];
collections.forEach(function(coll) {
db[coll].drop();
});
または、正規表現を使用して特定のパターンに一致するコレクションを削除する。
db.getCollectionNames().forEach(function(coll) {
if (coll.startsWith("temp_")) {
db[coll].drop();
}
});
ドキュメントの削除
deleteOneメソッド と deleteManyメソッド
コレクション内の特定のドキュメントを削除するには、deleteOne メソッド または deleteMany メソッドを使用する。
- 単一のドキュメントを削除する例
db.users.deleteOne({ name: "Alice" })
- 複数のドキュメントを削除する例
db.users.deleteMany({ age: { $lt: 18 } })
- 全てのドキュメントを削除する例
db.users.deleteMany({})
dropメソッド と deleteManyメソッド のパフォーマンス比較
コレクション全体を削除する場合、drop メソッド と deleteMany メソッド には以下の違いがある。
| メソッド | パフォーマンス | インデックス | 用途 |
|---|---|---|---|
| drop | 高速 | 削除される | コレクション全体を削除する場合 |
| deleteMany | 低速 | 保持される | ドキュメントのみを削除する場合 |
drop メソッドは、コレクションとインデックスを1度に削除するため、大量のドキュメントを削除する場合は高速である。
deleteMany メソッドは、各ドキュメントを個別に削除するため、大量のドキュメントを削除する場合は低速である。
コレクションの確認
show collectionsコマンド
データベース内の全てのコレクションを表示する。
show collections
db.getCollectionNamesメソッド
プログラム内でコレクション名を取得する。
db.getCollectionNames()
このメソッドは、コレクション名の配列を返す。
db.collection.statsメソッド
コレクションの詳細な統計情報を取得する。
db.users.stats()
出力される情報には、以下に示すものが含まれる。
- ドキュメント数
- コレクションのサイズ
- インデックス数
- インデックスのサイズ
- ストレージエンジンの情報
スキーマ検証 (制約の代替)
スキーマ検証とは
MongoDBはスキーマレスのデータベースであるが、$jsonSchema を使用することで、ドキュメントの構造を検証できる。
これは、RDBMSの制約 (NOT NULL、型指定等) に相当する機能である。
$jsonSchemaによる検証
スキーマ検証を設定したコレクションの作成例を以下に示す。
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email", "age"],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
email: {
bsonType: "string",
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
description: "must be a valid email address"
},
age: {
bsonType: "int",
minimum: 0,
maximum: 120,
description: "must be an integer between 0 and 120"
},
status: {
enum: ["active", "inactive", "pending"],
description: "can only be one of the enum values"
}
}
}
}
})
下表に、主な検証オプションを示す。
| オプション | 説明 |
|---|---|
bsonType |
フィールドのデータ型を指定するstring、int、double、object、array 等
|
required |
必須フィールドを指定する配列 |
pattern |
文字列フィールドに対する正規表現パターン |
minimum / maximum |
数値フィールドの最小値 / 最大値 |
enum |
許可される値のリスト |
バリデーションレベルとアクション
スキーマ検証の動作を制御するために、下表のオプションを使用できる。
| オプション | 値 | 説明 |
|---|---|---|
validationLevel |
strict (デフォルト) |
全ての挿入と更新に対して検証を適用する。 |
moderate |
既に有効なドキュメントの更新のみを検証する。 | |
validationAction |
error (デフォルト) |
検証に失敗した操作を拒否する。 |
warn |
検証に失敗した操作を許可するが、警告をログに記録する。 |
設定例を以下に示す。
db.createCollection("products", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "price"]
}
},
validationLevel: "moderate",
validationAction: "warn"
})
既存コレクションへの検証の追加
既存のコレクションにスキーマ検証を追加するには、collMod コマンドを使用する。
db.runCommand({
collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"]
}
},
validationLevel: "strict",
validationAction: "error"
})
インデックス
インデックスとは
インデックスは、クエリのパフォーマンスを向上させるためのデータ構造である。
適切なインデックスを設定することで、検索速度が大幅に向上する。
単一フィールドインデックス
以下の例では、単一のフィールドに対してインデックスを作成している。
db.users.createIndex({ name: 1 })
1 は昇順、-1 は降順を示す。
ユニークインデックス
これは、RDBMSのUNIQUE制約に相当する。
以下の例では、フィールドの値が一意であることを保証するインデックスを作成している。
db.users.createIndex({ email: 1 }, { unique: true })
複合インデックス
複合インデックスは、指定された順序でフィールドをソートする。
以下の例では、複数のフィールドに対してインデックスを作成している。
db.users.createIndex({ name: 1, age: -1 })
インデックスの確認
コレクションのインデックスを確認する。
db.users.getIndexes()
インデックスの削除
特定のインデックスを削除する。
db.users.dropIndex("name_1")
全てのインデックスを削除する。
db.users.dropIndexes()
※注意
_id フィールドのインデックスは削除できない。
インポート
mongoimportコマンドの基本
外部ファイルからデータをインポートするには、mongoimport コマンドを使用する。
このコマンドは、JSON、CSV、TSV形式のファイルをサポートしている。
JSONファイルのインポート
以下の例では、JSON形式のファイルをインポートしている。
mongoimport --db mydb --collection users --file users.json --jsonArray
| オプション | 説明 |
|---|---|
--db |
インポート先のデータベース名。 |
--collection |
インポート先のコレクション名。 |
--file |
インポートするファイルのパス。 |
--jsonArray |
ファイルがJSON配列形式の場合に指定する。 |
JSON Lines形式 (1行に1つのJSONオブジェクト) の場合は、--jsonArray オプションを省略する。
mongoimport --db mydb --collection users --file users.jsonl
CSVファイルのインポート
CSV形式のファイルをインポートする例を以下に示す。
mongoimport --db mydb --collection users --type=csv --headerline --file users.csv
| オプション | 説明 |
|---|---|
--type=csv |
ファイル形式をCSVとして指定する。 |
--headerline |
最初の行をフィールド名として使用する。 |
ヘッダ行がない場合は、--fields オプションでフィールド名を指定する。
mongoimport --db mydb --collection users --type=csv --fields=name,email,age --file users.csv
認証が必要な場合
MongoDBに認証が設定されている場合、以下に示すオプションを追加する。
mongoimport --db mydb --collection users --file users.json --username admin --password admin --authenticationDatabase admin
リモートホストへのインポート
リモートのMongoDBサーバにインポートする場合、以下に示すオプションを使用する。
mongoimport --host 192.168.1.100 --port 27017 --db mydb --collection users --file users.json
既存データの扱い
既存のドキュメント と _id フィールドが重複する場合の動作を制御するには、以下に示すオプションを使用する。
- 既存のドキュメントを更新する
mongoimport --db mydb --collection users --file users.json --mode=upsert
- 既存のドキュメントをスキップする
mongoimport --db mydb --collection users --file users.json --mode=merge
関連情報
- MongoDB公式ドキュメント - データベースとコレクション
- MongoDB公式ドキュメント - スキーマ検証
- MongoDB公式ドキュメント - インデックス
- MongoDB公式ドキュメント - mongoimport