我正在尝试使用聚合功能在图表中显示信息。对于此示例,集合中的文档如下所示(不包括此查询的不必要字段):
{
'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'
)
)
)
当查询完成OK并返回数据时,我没有收到pos
字段,只返回locid
和collat
。
问题
$project
的意思吗?我用它来告诉司机我要归还哪些字段?pos
字段返回,我怎么能告诉司机我只想要每个locid
&amp;的最低值? collat
组合对?所以说该日期,位置和人物有两个条目:4&amp; 8.我只关心pos
= 4 我的最终目标是创建一个折线图,其中X轴为日期(来自collat
),而Y轴将为pos
字段,每一行将绘制单个{ {1}}数据。
以下是发送到聚合驱动程序的所有参数。
locid
更新这是我将其分组的方式&amp;返回$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
答案 0 :(得分:4)
聚合查询类似于SQL语句group by
。您告诉{$group}
您想要哪些字段&#39; GROUP BY&#39;但是你没有告诉它你想如何聚合分组信息。
你想要的{$group}
可能是这样的:
{$group : { _id : { locid: "$locid", collat: "$collat"},
pos : {$min : "$pos"}
}
}