MongoDB:如何通过过滤返回不同的数据

时间:2013-03-06 15:49:18

标签: mongodb symfony map reduce

我有一个包含大量帖子的“帖子”集合,我想从YearMonth

中检索不同的post.published_date

返回示例:

['201303', '201301', '201212' ... ... ]

我正在使用Symfony2 + DoctrineMongoDB。 我想我会使用QueryBuilder和map和reduce函数,但是我无法使用它们!

任何帮助将不胜感激

由于

2 个答案:

答案 0 :(得分:0)

我建议在客户端过滤日期,但如果你真的需要在服务器上过滤,你可以使用汇总框架$ unwind / $ addToSet技巧。像这样:

db.post.aggregate([
        {$match: ...}, // your match here
        {$project: {
               published_date: 1
        }},
        {$unwind: "$published_date"},
        {$group: {
             _id: "$_id",
             unique_published_date: {$addToSet: "$published_date"}
        }}
])

答案 1 :(得分:0)

如果您正在使用symfony2和mongo db,则可以按如下所示为集合创建存储库,并调用存储库函数findDistinctYearMonth

class PostRepository extends DocumentRepository {    
    public function findDistinctYearMonth()
            {
                $yearMonths = $this->createQueryBuilder()
                    ->map('function() {
                    var yearMonth =
                    emit("" + this.published_date.getFullYear()+("0"+(this.published_date.getMonth()+1)).slice(-2),1);
                    }')
                    ->reduce('function(k,v) {
                       return 1;
                    }')
                    ->getQuery()
                    ->execute();

    $arr = array();
    foreach($yearMonths as $yearMonth) {
        $arr[] = $yearMonth["_id"];
    }
    return $arr;
}
}