我对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>.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
的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)
}
甚至是我能做的事情吗?
答案 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
}