0

我有一个包含很多帖子的“帖子”集合,我想从中检索不同的YearMonth价值post.published_date

返回示例:

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

我正在使用 Symfony2 + DoctrineMongoDB。我想我必须将 QueryBuilder 与 map 和 reduce 函数一起使用,但我无法使用它们!

任何帮助将不胜感激

谢谢

4

2 回答 2

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;
}
}
于 2013-03-06T17:46:02.907 回答
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"}
        }}
])
于 2013-03-06T16:14:09.420 回答