无法使聚合函数起作用

时间:2013-04-23 17:03:25

标签: php mongodb aggregation-framework

我对Mongo完全不熟悉,而且我在围绕聚合框架时遇到了一些麻烦。我有一个看起来像这样的文件:

record {
    _id: '2013-04-22/tacos',
    first: {
        something: {0: 1, 1:4},
        somethingelse: {0: 18, 1:22}
    },
    second: {
        0: [11, 18, 7],
        1: [17, 9, 22]
    },
    metadata: {
        date: '2013-04-22'
    }
}

我想要做的是获取first.something中每个项目的总和(因为这将需要使用多个文档),每秒中的每个项目,然后first.something中的所有项目的总和,{{ 1}},second.<whatever>.0second.<whatever>.1。所以我正在寻找这样的结果(原谅我的格式化):

second.<whatever>.2

现在我只是想让前两个工作在一条记录中,而且我已经得到了这个:

sum(first.something.0):      1
sum(first.something.1):      4
sum(second.0.0):            11
sum(second.0.1):            18
sum(second.0.2):             7
sum(second.1.0):            17
sum(second.1.1):             9
sum(second.1.2):            22
sum(first.something.all):    5
sum(second.<whatever>.0):   28
sum(second.<whatever>.1):   27
sum(second.<whatever>.2):   29

但是我的输出告诉我// $db is my collection, and is verified to work $aggregate = array( '$group' => array( '_id' => '$metadata.date', 'first_zero' => array('$sum' => 'first.something.0'), 'first_one' => array('$sum' => 'first.something.1') ), '$match' => array( "metadata.date" => '2013-04-22' ) ); $cursor = $db->aggregate($aggregate); var_dump($cursor); 。但如果我遗漏了exception: A pipeline stage specification object must contain exactly one field.部分,它将返回带有'$match'first_zero的int(0)的记录,如下所示:

first_one

所以我甚至无法让简单的部分工作。我在这做错了什么? array(2) { ["result"]=> array(1) { [0]=> array(3) { ["_id"]=> string(10) "2013-04-22" ["clicks_zero"]=> int(0) ["clicks_one"]=> int(0) } } ["ok"]=> float(1) } 甚至是我能做的事情吗?

1 个答案:

答案 0 :(得分:2)

我不是Php的专家,但聚合查询应该是这样的:

  $aggregate = array(
      array('$group' => array(
          '_id' => '$metadata.date',
          'first_zero' => array('$sum' => 'first.something.0'),
          'first_one' => array('$sum' => 'first.something.1')
      )),
      array('$match' => array(
          "metadata.date" => '2013-04-22'
      ))
  );

每个管道运算符都应该在哈希/数组中。

修改

但是,由于最后的$match管道,上面的内容不会给你带来任何结果。在上一个管道中没有创建metadata.date字段,因此没有结果与您的查询匹配。正确的解决方案是:

  $aggregate = array(
      array('$match' => array(
          "metadata.date" => '2013-04-22'
      )),
      array('$group' => array(
          '_id' => '$metadata.date',
          'first_zero' => array('$sum' => 'first.something.0'),
          'first_one' => array('$sum' => 'first.something.1')
      ))
  );

哪个会给你:

{
"result" : [
    {
        "_id" : "2013-04-22",
        "first_zero" : 1,
        "first_one" : 4
    }
],
"ok" : 1
}