集計関数を使用してチャートに情報を表示しようとしています。この例では、コレクション内のドキュメントは次のようになります(このクエリの不要なフィールドを除く)。
{
'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
フィールドは返されません。とだけが返さlocid
れcollat
ます。
質問
- それは何
$project
のためですか?どのフィールドを返したいかをドライバーに伝えるために使用しますか? - フィールドも返されるようになったら、各ペアとコンボペア
pos
の最小値のみが必要であることをドライバーに伝えるにはどうすればよいですか?つまり、その日付、場所、および人物の2つのエントリがあるとします。4と8です。私は=4だけを気にします。locid
collat
pos
私の最終目標は、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')
)
)