1

集計関数を使用してチャートに情報を表示しようとしています。この例では、コレクション内のドキュメントは次のようになります(このクエリの不要なフィールドを除く)。

{
 'locid' : <someid>, #Reference to a city & state collection
 'collat' : <dateobj>, #a date object when this entry was saved 
 'pid' : <someid>, #Reference to a person collection 
 'pos' : <int> #Value I am interested in matching with location & date
 }

だから私は基本的に。から始めpidます。これを最初の$matchパラメーターとして使用して、パイプラインにスローされるデータの量を制限します。

array(
    '$match' => array(
         'pid' => new \MongoId($pid)
     )
),

正しいものを選択したpidので、特定のフィールドのみが必要/必要であると伝えます。

array(
    '$project' => array(
        'pos' => 1,
        'collat' => 1,
        'locid' => 1
    )
),    

2番目の一致は、現在これらの場所のみを気にしていると言うことです($idsの配列が含まれていますlocid):

    array(
        '$match' => array(
            'locid' => array('$in' => $ids)
        )
    ),

そして最後に、私はすべての返されたドキュメントをグループ化すると言っていcollatますlocid

array(
            '$group' => array(
                '_id' => array(
                    'locid' => '$locid',
                    'collat' => '$collat'
                )
            )
        )

クエリがOKを完了してデータを返している間、posフィールドは返されません。とだけが返さlocidcollatます。

質問

  1. それは何$projectのためですか?どのフィールドを返したいかをドライバーに伝えるために使用しますか?
  2. フィールドも返されるようになったら、各ペアとコンボペアposの最小値のみが必要であることをドライバーに伝えるにはどうすればよいですか?つまり、その日付、場所、および人物の2つのエントリがあるとします。4と8です。私は=4だけを気にします。locidcollatpos

私の最終目標は、X軸を日付(からcollat)として、Y軸をposフィールドとし、各線が個々のlocidデータをプロットする折れ線グラフを作成することです。

これが、アグリゲーションドライバーに送信されるパラメーター全体です。

$ops = array(
        array(
            '$match' => array(
                'pid' => new \MongoId($pid)
            )
        ),
        array(
            '$project' => array(
                'pos' => 1,
                'collat' => 1,
                'locid' => 1
            )
        ),
        array(
            '$match' => array(
                'locid' => array('$in' => $ids)
            )
        ),
        array(
            '$group' => array(
                '_id' => array(
                    'locid' => '$locid',
                    'collat' => '$collat'
                )
            )
        )
    );
    $out = $myCollection->aggregate($ops);

更新これはpos、エラーをスローせずにグループ化して返す方法です。ただし、実際に正しい値を返していることを確認するために、スポットチェックする必要があります。

array(
            '$group' => array(
                '_id' => array(
                    'locid' => '$locid',
                    'collat' => '$collat'
                ),
                array('$min' => '$pos')
            )
        )
4

1 に答える 1

4

集計クエリは、SQL ステートメントに似ていますgroup by。「GROUP BY」するフィールドを指定しています{$group}が、グループ化された情報をどのように集計するかを指定していません。

あなた{$group}が望むのはおそらく次のようなものです:

{$group : { _id : { locid: "$locid", collat: "$collat"},
            pos : {$min : "$pos"}
           }
 }
于 2013-02-06T21:06:03.330 に答える