MongoDb通过嵌入文档聚合

时间:2013-11-27 10:02:55

标签: mongodb

我试图在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),
),

感谢您的任何建议。

2 个答案:

答案 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。