MongoDB聚合查询不返回所有字段

时间:2013-02-06 20:59:34

标签: mongodb mongodb-php

我正在尝试使用聚合功能在图表中显示信息。对于此示例,集合中的文档如下所示(不包括此查询的不必要字段):

{
 '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'
                )
            )
        )

当查询完成OK并返回数据时,我没有收到pos字段,只返回locidcollat

问题

  1. 那不是$project的意思吗?我用它来告诉司机我要归还哪些字段?
  2. 一旦我将pos字段返回,我怎么能告诉司机我只想要每个locid&amp;的最低值? collat组合对?所以说该日期,位置和人物有两个条目:4&amp; 8.我只关心pos = 4
  3. 我的最终目标是创建一个折线图,其中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

1 个答案:

答案 0 :(得分:4)

聚合查询类似于SQL语句group by。您告诉{$group}您想要哪些字段&#39; GROUP BY&#39;但是你没有告诉它你想如何聚合分组信息。

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

{$group : { _id : { locid: "$locid", collat: "$collat"},
            pos : {$min : "$pos"}
           }
 }