2016-07-01 5 views
2

私はmongoDBデータを調べるためのウェブサイトを行っています。私のデータベースには、スマートフォンから捕捉したGPS測定値が保存されています。私はこれらの測定値を探索するためにさまざまなクエリを使用しています。私は日ごとにグループ化して測定値を数える1つのクエリを持っています。別のクエリでは、各種類のスマートフォン(iOS、Android、)の測定数がカウントされます。など。

これらのクエリは、すべて集約パイプラインで同じ$ matchパラメータを共有します。このパイプラインでは、時間間隔および地理的エリアに焦点を合わせるために測定をフィルタリングします。

$一致で得られたサブセットをキャッシュに保存する方法は、毎回このフィルタを適用する必要はありませんか?

私のクエリの応答時間を最適化したい。 1つのクエリの

サンプル:

cursor = db.myCollection.aggregate(
    [ 
    { 
     "$match": 
     { 
      "$and": [{"t": {"$gt": tMin, "$lt": tMax}, "location":{"$geoWithin":{"$geometry":square}}}] 
     } 
    }, 
    { 
     "$group": 
     { 
      "_id": {"hourGroup": "$tHour"}, 
      "count": {"$sum": 1} 
     } 
    } 
    ] 
) 

私はキャッシュにその結果を維持したい:

"$match": 
    { 
     "$and": [{"t": {"$gt": tMin, "$lt": tMax}, "location":{"$geoWithin":{"$geometry":square}}}] 
    } 
+0

私はそれを行う方法がわかりません。 – SwissFr

答えて

1

あなたがそれを行うことができます方法は$outを使用して新しいコレクションを作成することですパイプライン段階。

次に、クエリバッチを実行すると、最初のクエリで一致する出力が作成され、次のクエリでは結果が使用されます。

開発中の新しいパイプラインステージは、任意のコメントを歓迎

(計画はモンゴ3.4で、それは準備ができていることです)、我々は試合を実行し、複数の集約パスにこの結果を使用することができます$facetと呼ばれるがあります!

+0

私のデータセットは非常に大きいです。新しいコレクションの作成は、ストレージの点で問題になる可能性があります。 $ facetは将来解決するかもしれませんが、私は現時点で代替案が必要です。 – SwissFr

関連する問題