我有一个包含很多帖子的“帖子”集合,我想从中检索不同的YearMonth
价值post.published_date
返回示例:
['201303', '201301', '201212' ... ... ]
我正在使用 Symfony2 + DoctrineMongoDB。我想我必须将 QueryBuilder 与 map 和 reduce 函数一起使用,但我无法使用它们!
任何帮助将不胜感激
谢谢
如果您使用的是 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;
}
}
我建议在客户端过滤日期,但如果你真的需要在服务器上过滤,你可以使用聚合框架 $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"}
}}
])