Docs Menu
Docs Home
/ / /
Ruby MongoDB ドライバー
/

コレクション

項目一覧

  • 時系列コレクション
  • 上限付きコレクション
  • 既存のコレクションを上限付きに変換する
  • ドキュメントの検証
  • 既存のコレクションへの検証の追加
  • コレクションの一覧化
  • コレクションの削除

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以降を使用している場合は、ドキュメント検証を使用できます。 検証機能を持つコレクションは、挿入またはアップデートされた各ドキュメントを バリデーター オプションで指定された基準と比較します。 validationLevelvalidationActionに応じて、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

戻る

Databases