明らかにこれは古い質問ですが、時系列データについてMongoDBを調査しているときに出くわしました。新しい挿入操作ではなく、事前に完全なドキュメントを割り当てて更新操作を実行するために、次のアプローチを共有する価値があるのではないかと思いました。このアプローチはこことここに文書化されていることに注意してください。
毎分データを保存していると想像してください。次のドキュメント構造を検討してください。
{
timestamp: ISODate("2013-10-10T23:06:37.000Z"),
type: ”spot_EURUSD”,
value: 1.2345
},
{
timestamp: ISODate("2013-10-10T23:06:38.000Z"),
type: ”spot_EURUSD”,
value: 1.2346
}
これは、標準的なリレーショナルアプローチに匹敵します。この場合、記録された値ごとに1つのドキュメントを作成するため、多くの挿入操作が発生します。私たちはもっとうまくやることができます。次のことを考慮してください:
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “spot_EURUSD”,
values: {
0: 1.2345,
…
37: 1.2346,
38: 1.2347,
…
59: 1.2343
}
}
これで、1つのドキュメントを記述し、59の更新を実行できます。更新はアトミックであり、個々の書き込みは小さく、他のパフォーマンスと同時実行の利点があるため、これははるかに優れています。しかし、1時間だけでなく、1日全体を1つのドキュメントに保存したい場合はどうでしょうか。これには、最後の値を取得するために1440エントリに沿って歩く必要があります。これを改善するために、さらに次のように拡張できます。
{
timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
type: “spot_EURUSD”,
values: {
0: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
1: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
…,
22: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
23: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343}
}
}
このネストされたアプローチを使用すると、1日の最後の値を取得するために、最大で24+60を歩くだけで済みます。
事前にすべての値をパディングで埋めてドキュメントを作成しておけば、ドキュメントのサイズが変更されないため、移動されないことが保証されます。