我有一个包含 created_date 属性的文档集合。我想通过聚合管道发送这些文档以对它们进行一些工作。理想情况下,我想在对它们进行任何其他工作之前使用 $match 过滤它们,以便我可以利用索引但是我无法弄清楚如何在我的$匹配表达式。
有一些关于如何在 $project 操作中使用运算符的示例,但我担心通过将 $project 作为我管道中的第一步,我将无法访问我的索引(MongoDB 文档表明第一个表达式必须是 $match 才能利用索引)。
样本数据:
{
post_body: 'This is the body of test post 1',
created_date: ISODate('2012-09-29T05:23:41Z')
comments: 48
}
{
post_body: 'This is the body of test post 2',
created_date: ISODate('2012-09-24T12:34:13Z')
comments: 10
}
{
post_body: 'This is the body of test post 3',
created_date: ISODate('2012-08-16T12:34:13Z')
comments: 10
}
我想通过一个聚合管道运行它,以获取 9 月发布的所有帖子的总评论数
{
aggregate: 'posts',
pipeline: [
{$match:
/*Can I use the $year/$month operators here to match Sept 2012?
$year:created_date : 2012,
$month:created_date : 9
*/
/*or does this have to be
created_date :
{$gte:{$date:'2012-09-01T04:00:00Z'},
$lt: {$date:'2012-10-01T04:00:00Z'} }
*/
},
{$group:
{_id: '0',
totalComments:{$sum:'$comments'}
}
}
]
}
这有效,但匹配失去了对更复杂查询的任何索引的访问权限:
{
aggregate: 'posts',
pipeline: [
{$project:
{
month : {$month:'$created_date'},
year : {$year:'$created_date'}
}
},
{$match:
{
month:9,
year: 2012
}
},
{$group:
{_id: '0',
totalComments:{$sum:'$comments'}
}
}
]
}