我正在尝试使用聚合函数在图表中显示信息。对于此示例,集合中的文档如下所示(不包括此查询的不必要字段):
{
'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
)
),
第二个匹配是说我现在只关心这些位置($ids
包含一个数组locid
):
array(
'$match' => array(
'locid' => array('$in' => $ids)
)
),
最后,我是说将所有退回的文件按collat
和locid
array(
'$group' => array(
'_id' => array(
'locid' => '$locid',
'collat' => '$collat'
)
)
)
虽然查询完成并返回数据,但我没有pos
取回该字段,它只返回locid
and collat
。
问题
- 不
$project
就是为了这个吗?我用它来告诉驱动程序我想要返回哪些字段? - 一旦我也得到了
pos
字段返回,我怎么能告诉司机我只想要每个locid
&collat
组合对的最低值?因此,假设该日期、位置和人员有两个条目:4 和 8。我只关心pos
=4
我的最终目标是创建一个折线图,其中 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')
)
)