MongoDBを使用して時系列を処理しようとしています。コミュニティによって採用されている共通の解決策は、サブ文書を使用して異なるレベルの細かさで情報を格納することです( Schema Design for Time Series Data in MongoDB参照)。MongoDBコレクションの更新:デフォルト値で文書を初期化する
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”,
values: [
999999, // 1 second
…
1000000, // nth second
1500000, // n+1th second
…
2000000 // 60th
]
}
文書を分情報によって索引付けされ、各第二のためのより詳細な情報を格納するサブ文書が含ま:
は、例えば、以下の文書を見てみましょう。
これまでのところとても良いです。この種のアプローチは、正しく動作するために最適化を必要とする:
Another optimization [..] is preallocating all documents for the upcoming time period; This never causes an existing document to grow or be moved on disk.
1はupdate
方法に$setOnInsert
プロパティを使用することができます上記の最適化を実現するために。
db.getCollection('aCollection').update(
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”
},
{
$setOnInsert: { values: {'0': 0, '1': 0, '2': 0}},
$inc: {"values.30": 1}
},
{ upsert: true }
)
同じアップデートを2つの異なる操作で使用することはできません。この問題は、このissueに追跡さ
Cannot update 'values' and 'values.30' at the same time
:上記更新istruction、次のエラーが発生します。
私の質問です:回避策はありますか?私はインデックスフィールドフィールドtype
の先験的(上記の例では、値の値を知ることができないので、私は、空の文書を事前に割り当て任意のバッチを使用することはできません。
感謝の接頭辞事前に。
なぜ挿入に失敗しますか?タイプとタイムスタンプにユニークなインデックスがありますか? –
あなたが正しいです、私はこの点を挿入することを忘れています。 '_id'は文書の他のフィールドから派生しなければなりません。 –