3

私はmongoストア「task」を持っています。これには、ハッシュを受け取る配列「answers」があり、その要素の要素はタイムスタンプです。それで:

task ->
  project_id,
  answers ->
    [ 
       {
         timestamp: <time>,
         question_1: <answer_1>,
         question_2: <answer_2>
       },
       {
         timestamp: <time>,
         question_1: <answer_1>,
         question_2: <answer_2>
       },
    ]

私がやりたいのは、特定のプロジェクトIDを持ち、最新の回答のタイムスタンプフィールドが過去24時間以内にあるすべてのタスクのリストを取得することです。プロジェクトIDのことは明らかに非常に簡単で、タイムスタンプが$gteと$ltで指定された期間の間にあるかどうかを判断できます...しかし、それを最新のタイムスタンプのみにスコープする方法がわかりません。

私はこれにORMを使用していません。したがって、単純なmongoクエリ構文のみを使用することをお勧めします。

アドバイスをいただければ幸いです。

4

2 に答える 2

3

@shelmanが述べたように、Map Reduceは必須ではなく、ここでは最良の方法とは考えていません。MR は実際には独自のアプリケーションに対してインラインで実行するようには設計されておらず、(定義上) 遅いことに注意してください。

通常、集計フレームワーク (これを簡単に実行できます) を使用するか、通常のクエリを使用する方が適切です。

最新のプロジェクトの回答が 24 時間以内に収まるかどうかを知りたい場合でも、24 時間以内に収まるプロジェクトの回答を含める必要があると想定することをお勧めします。なぜだめですか?)。したがって、これは(@shelmanが言ったように)次の方法で実現できます。

find({project_id: 5, "answers.timestamp": {$gte: ISODate(), $lt: ISODate()}})

これにより、過去 24 時間以内に回答のあるプロジェクトが見つかります。次に、最初/最後の回答 (これは常に探しているものである必要があります) を除外して、アプリケーションにインラインではるかにパフォーマンスの高い結果を得ることができます。

于 2012-12-06T08:43:11.973 に答える
1

使用しようとしている正確なクエリを誤解している可能性がありますが、これに map reduce が必要な理由がわかりません。正しいものと24 時間前project_idのタイムスタンプの複合クエリは機能しませんか?$gt

于 2012-12-05T22:39:39.260 に答える