6

基本的に日付/整数のキーと値のペアの配列であるデータを保存する必要があり、日付は常に一意になります。

連想配列のように保存できるようにしたい:

array(
    "2012-02-26" => 5,
    "2012-02-27" => 2,
    "2012-02-28" => 17,
    "2012-02-29" => 4
)

しかし、日付を照会できるようにする必要もあります (つまり、日付 > 2012-02-27 のすべてを取得する) ため、次のようなスキーマを使用する必要があると思われます。

array(
    array("date"=>"2012-02-26", "value"=>5),
    array("date"=>"2012-02-27", "value"=>2),
    array("date"=>"2012-02-28", "value"=>17),
    array("date"=>"2012-02-29", "value"=>4),
)

明らかに、前者の方がはるかにクリーンで簡潔ですが、希望する方法でクエリを実行できますか?そうでない場合、より適切な他のスキーマはありますか?

4

1 に答える 1

11

2 つの方法について説明しましたが、それらを分解してみましょう。

方法 #1 - 連想配列

「連想配列」によるクエリの重要なツールは$exists演算子です。オペレーターの詳細はこちら。

したがって、次のようなクエリを確実に実行できます。

db.coll.find( { $exists: { 'field.2012-02-27' } } );

あなたの説明に基づいて、$exists演算子とうまく一致しない範囲クエリを探しています。「連想配列」バージョンも索引付けが困難です。

方法 #2 - オブジェクトの配列

これは間違いなくより優れたクエリ機能を持っています:

db.coll.find( { 'field.date': { $gt: '2012-02-27' } } );

索引付けも可能

db.coll.ensureIndex( { 'field.date': 1 } );

ただし、更新にはトレードオフがあります。特定の日付の値を増やしたい場合は、この扱いにくい$位置演算子を使用する必要があります。これはオブジェクトの配列に対して機能しますが、さらにネストされたものに対しては失敗します。

その他の問題

これらの方法のいずれかに関する 1 つの問題は、データの長期的な増加です。オブジェクトのサイズを拡大すると、ディスクとメモリでより多くのスペースが必要になります。2 年分のデータを持つオブジェクトがある場合、今日のデータを更新するには、700 個のアイテムの配列全体がメモリ内にある必要があります。これは特定のデータの問題ではないかもしれませんが、考慮する必要があります。

同様に、MongoDB クエリは常に最上位オブジェクトを返します。繰り返しになりますが、700 個のアイテムの配列がある場合、一致する各ドキュメントに対してすべてのアイテムが取得されます。返されるフィールドを除外する方法はありますが、「オブジェクトの配列」では機能しません。

于 2012-03-01T01:25:52.487 に答える