0

我对 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, second.<whatever>.0,second.<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'部分,它会返回带有 int(0) 的记录,first_zero如下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)
}

所以我什至无法让简单的部分工作。我在这里做错了什么?甚至是second.<whatever>.0我能做的事情吗?

4

1 回答 1

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
}
于 2013-04-24T01:58:24.220 回答