![](/img/trans.png)
[英]MongoDb/PHP, can't get grouping to work right with aggregate framework
[英]Can't get aggregate functions to work
我对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
的所有项目的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'
部分,它会返回第一个first_zero
和第first_one
int(0)记录,如下所示:
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
即便是我可以做的事情?
我不是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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.