2012-02-29 19 views
6

私は基本的にdate/intのキーと値のペアの配列であるデータを格納する必要があります。日付は常に一意になります。MongoDB - 連想配列キーで照会することはできますか?

私は連想配列のようにそれを格納できるようにしたいと思います:

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), 
) 

明らかに前者は非常にクリーンで、より簡潔ですが、私は私が望んでいた方法でそれを照会することができますより適切であるかもしれない他のスキーマが存在するのであれば?

+0

http://www.php.net/manual/en/mongo.queries.php –

+0

私はその形式で日付を保存しません。使用時間();関数。日付などの並べ替えが簡単になります。 http://php.net/manual/en/function.time。PHP –

答えて

10

あなたは2つの方法を説明しました。

方法#1 - 連想配列

"連想配列" で照会するための重要なツールは、$exists演算子です。 Hereはオペレーターの詳細です。

だから、あなたは間違いなく、次のようなクエリを実行することができます:あなたは$existsオペレータとよく一致しない範囲クエリを探しているあなたの説明に基づいて

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

。 「連想配列」バージョンも索引付けが困難です。

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

は、これは間違いなく良いクエリの機能があります。

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

また

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

しかし、トレードがあるのインデックスを作成することができますオフに更新します。特定の日付の値を増分したい場合は、この扱いにくい$位置演算子を使用する必要があります。これはオブジェクトの配列に対して機能しますが、それ以上ネストすると失敗します。これらのいずれかの方法で

その他の問題

1つの問題は、データの長期的な成長です。オブジェクトのサイズを拡張すると、ディスク上とメモリ内にさらに多くの領域が必要になります。 2年分のデータを持つオブジェクトがある場合、700項目の配列全体が、今日のデータを更新するためにメモリに格納されている必要があります。これはあなたの特定のデータには問題ではないかもしれませんが、考慮する必要があります。

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

+0

'2年分のデータを持つオブジェクトがあれば、今日のデータを更新するために、700項目の配列全体がメモリに格納されている必要があります。' $ slice 'を使ってサブセットを削除するとどうでしょうか?配列に新しい項目を追加する '$ push'? –

+0

これはデータを返すために機能しますが、日付順にプッシュした場合に限ります。しかし、サーバー側では、オブジェクト全体を渡すだけでもオブジェクト全体をメモリにプルする必要があります。 –

+0

ああ私はそれを認識しませんでした、私はそれが指定されたサブセットだけを削除するほどスマートだと思った。それは私の現在のプロジェクトのための少しのデングブレイカーです。私がラインを6ヶ月間停止し、それを実現するのを止めてくれてありがとう! –

関連する問題