我试图在Mongodb中获得分组/聚合结果。
这就是我的收藏品的样子:
Array(
[_id] => 529474f4adcc2bb25b662f2f
[lists] => Array
(
[0] => Array
(
[_id] => 529466c8adcc2b5a5b662f13
[name] => List 4
[status] => active
[changed_at] => 1385460980
)
[1] => Array
(
[_id] => 529466c8adcc2b5a5b662f12
[name] => List 3
[status] => inactive
[changed_at] => 1385460980
)
)
[name] => Name 20)
我想获得一个结果,该结果将根据changed_at
计算按月分组的非活动用户。
我可以这样得到结果:
$ops = array(
array(
'$match' => array(
'lists.status' => 'inactive'
)
)
);
$unsubYearStats = $c->aggregate($ops);
问题是如何使用$group
按匹配元素分组? (在这种情况下,通过List的3“changed_at”字段)
类似的东西:
'$group' => array(
"_id" => array("month" => array('$month' => '-->$matched_subdocument.changed_at<--')),
"total" => array('$sum' => 1),
),
感谢您的任何建议。
答案 0 :(得分:0)
您可以在分组前使用$match查找非活动用户。
查询应该是这样的:
db.myObject.aggregate(
{$unwind : "$lists"},
{$match : {"lists.status" : "inactive"}},
{$group : /* write group query here*/}
);
答案 1 :(得分:0)
正如parvin指出的那样,$ unwind运算符是正确的方法。
这是我的问题:
$ops = array(
array(
'$unwind' => '$lists'
),
array(
'$match' => array(
"lists.status" => 'active',
),
),
array(
'$group' => array(
"_id" => array("month" => array('$month' => '$lists.changed_at'), "year" => array('$year' => '$lists.changed_at')),
"total" => array('$sum' => 1),
),
),
);
首先是$ unwind,然后是$ match然后是$ group。