MongoDB - コレクション

提供: MochiuWiki : SUSE, EC, PCB

概要

MongoDBにおけるコレクション (Collection) は、ドキュメントの集合である。
リレーショナルデータベース管理システム (RDBMS) のテーブルに相当する。

MongoDBはスキーマレスのため、同じコレクション内のドキュメントが異なる構造を持つことができる。
ただし、スキーマ検証機能を使用することにより、ドキュメントの構造を制約することも可能である。


RDBMSとの用語対応

下表に、MongoDBとMySQLの用語対応を示す。

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 Collectionのパラメータ
パラメータ 説明
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
 })


Time Series Collectionのパラメータ
パラメータ 説明
timeField タイムスタンプを格納するフィールド名。
metaField メタデータを格納するフィールド名 (オプション)
granularity データの粒度
secondsminuteshours のいずれか
expireAfterSeconds データの有効期限 (秒単位)



照合順序 (Collation)

照合順序とは

照合順序 (Collation) は、文字列の比較やソート時に使用される規則である。
言語固有の文字列比較ルール (大文字小文字の区別、アクセント記号の扱い等) を定義する。

下表に、照合順序の主なオプションを示す。

照合順序のオプション
オプション 説明
locale 必須項目である。
言語コード (例: jaenfr)
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 高速 削除される コレクション全体を削除する場合
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"
             }
          }
       }
    }
 })


下表に、主な検証オプションを示す。

$jsonSchemaの検証オプション
オプション 説明
bsonType フィールドのデータ型を指定する
stringintdoubleobjectarray
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


mongoimportのオプション (JSON)
オプション 説明
--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


mongoimportのオプション (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



関連情報