コレクション
MongoDB はドキュメントをコレクションに保存します。 コレクションが存在しない場合、MongoDB は最初にそのコレクションにドキュメントを挿入する際にコレクションを作成します。
また、最大サイズやドキュメント検証ルールの設定など、さまざまなオプションを使用してコレクションを明示的に作成することもできます。
時系列コレクション
時系列コレクションが MongoDB 5.0に追加されました。 ドキュメントは こちら からご覧ください。
時系列コレクションは一定期間にわたる測定値のシーケンスを効率的に保存します。 時系列データとは、一定時間にわたって収集され、1 つ以上の変更されていないパラメーターによって一意に識別される任意のデータです。 時系列データを識別する変更不可のパラメーターは、通常、データソースのメタデータです。
時系列コレクションの作成
時系列コレクションを作成するには、 時系列オプション を使用して明示的にコレクションを作成する必要があります。
opts = { time_series: { timeField: "timestamp", metaField: "metadata", granularity: "hours" }, expire_after: 604800 } db['weather', opts].create
時系列コレクションを作成するときは、次のオプションを指定します。
フィールド | 説明 |
---|---|
time_series[:timeField] | 必須。各時系列ドキュメントの日付を含むフィールドの名前です。 |
time_series[:metaField] | オプション。各時系列ドキュメントのメタデータを含むフィールドの名前。指定されたフィールドのメタデータは、ユニークな一連のドキュメントにラベルを付けるために使用されるデータでなければなりません。メタデータは、変更されることはほとんどありません。 |
time_series[:granularity] | 任意。 指定できる値は、「秒」、「分」、「時間」です。 デフォルトでは、MongoDB は高頻度の取り込みの場合、粒度を「 秒」に設定します。 |
:expireAfterSeconds | 任意。ドキュメントの有効期限が切れるまでの秒数を指定して、時系列コレクション内のドキュメントの自動削除を有効にします。MongoDB は期限切れのドキュメントを自動的に削除します。 |
時系列コレクション オプションの詳細については、 MongoDBのDocsを参照してください。
時系列コレクションへの挿入
時系列コレクションへの挿入は、通常のコレクションに挿入するのと同様です。
db['weather'].insert_many([ { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 18, 0, 0, 0), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 18, 4, 0, 0), temp: 11 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 18, 8, 0, 0), temp: 11 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 18, 12, 0, 0), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 18, 16, 0, 0), temp: 16 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 18, 20, 0, 0), temp: 15 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 19, 0, 0, 0), temp: 13 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 19, 4, 0, 0), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 19, 8, 0, 0), temp: 11 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 19, 12, 0, 0), temp: 12 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 19, 16, 0, 0), temp: 17 }, { metadata: { sensorId: 5578, type: "temperature" }, timestamp: Time.utc(2021, 5, 19, 20, 0, 0), temp: 12 } ])
時系列コレクションをクエリする
時系列コレクションのクエリも、通常のコレクションと非常によく似ています。
weather.find(timestamp: Time.utc(2021, 5, 18, 0, 0, 0)).first
このクエリの結果は次のとおりです。
{ "timestamp" => 2021-05-18 00:00:00 UTC, "metadata" => { "sensorId" => 5578, "type" => "temperature" }, "temp" => 12, "_id" => BSON::ObjectId('624dfb87d1327a60aeb048d2') }
時系列コレクションでの集計パイプラインの使用
集約パイプラインは、追加のクエリ機能に使用することもできます。
weather.aggregate([ { "$project": { date: { "$dateToParts": { date: "$timestamp" } }, temp: 1 } }, { "$group": { _id: { date: { year: "$date.year", month: "$date.month", day: "$date.day" } }, avgTmp: { "$avg": "$temp" } } } ]).to_a
この集計パイプライングループの例では、すべてのドキュメントが測定日ごとにグループ化され、その日のすべての温度測定値の平均が返されます。
[{ "_id" => { "date" => { "year" => 2021, "month" => 5, "day" => 18 } }, "avgTmp" => 12.833333333333334 }, { "_id" => { "date" => { "year" => 2021, "month" => 5, "day" => 19 } }, "avgTmp" => 12.833333333333334 }]
詳細については、時系列コレクションに関する MongoDB のドキュメントを参照してください。
上限付きコレクション
上限付きコレクションには最大サイズまたはドキュメント数が設定されているため、最大しきい値を超えて増えることはありません。すべての上限付きコレクションでは最大サイズを指定する必要があり、最大ドキュメント数も指定できます。MongoDB は、コレクションが最大ドキュメント数に達する前に最大サイズ制限に達した場合、古いドキュメントを削除します。
上限付きコレクションを作成するには、 capped: true
オプションとsize
をバイト単位で使用します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music') collection = client[:artists, capped: true, size: 10000] collection.create collection.capped? # => true
既存のコレクションを上限付きに変換する
既存のコレクションを Capped 以外から Capped に変換するには、 convertToCapped
コマンドを使用します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music') db = client.database db.command({ 'convertToCapped' => 'artists', 'size' => 10000 })
ドキュメントの検証
MongoDB バージョン3.2以降を使用している場合は、ドキュメント検証を使用できます。 検証機能を持つコレクションは、挿入またはアップデートされた各ドキュメントを バリデーター オプションで指定された基準と比較します。 validationLevel
とvalidationAction
に応じて、MongoDB は警告を返すか、指定された条件を満たさない場合はドキュメントの挿入または更新を拒否します。
次の例では、挿入または更新されたドキュメントが次の 3 つの条件のいずれか 1 つ以上に一致する必要があることを指定する バリデーターを使用してcontacts
コレクションを作成します。
phone
フィールドは string ですemail
フィールドが正規表現に一致するstatus
フィールドはUnknown
またはIncomplete
のいずれかです。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') client[:contacts, { 'validator' => { '$or' => [ { 'phone' => { '$type' => "string" } }, { 'email' => { '$regex' => /@mongodb\.com$/ } }, { 'status' => { '$in' => [ "Unknown", "Incomplete" ] } } ] } } ].create
既存のコレクションへの検証の追加
既存のコレクションにドキュメント検証条件を追加するには、 collMod
コマンドを使用します。 以下の例では、 contacts
コレクションに検証を追加して、すべての新しいドキュメントに数値であるage
フィールドが含まれている必要があることを確認する方法を示しています。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test') db = client.database db.command({ 'collMod' => 'contacts', 'validator' => { 'age' => { '$type' => "number" } } })
コレクションの一覧化
コレクションを一覧表示するには、データベース オブジェクトでcollections
メソッドまたはcollection_names
メソッドを使用します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music') database = client.database database.collections # Returns an array of Collection objects. database.collection_names # Returns an array of collection names as strings.
コレクションの削除
コレクションを削除するには、コレクション オブジェクトでdrop
を呼び出します。
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'music') artists = client[:artists] artists.drop