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
    )
),    

第二个匹配是说我现在只关心这些位置($ids包含一个数组locid):

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

最后,我是说将所有退回的文件按collatlocid

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

虽然查询完成并返回数据,但我没有pos取回该字段,它只返回locidand collat

问题

  1. $project就是为了这个吗?我用它来告诉驱动程序我想要返回哪些字段?
  2. 一旦我也得到了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')
            )
        )
4

1 回答 1

4

聚合查询就像一条 SQL 语句group by。您正在告诉{$group}您想要“GROUP BY”的字段,但您并没有告诉它您希望如何聚合分组信息。

你想要的{$group}可能是这样的:

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