Как использовать операторы агрегирования в $ match в MongoDB (например, $ year или $ dayOfMonth)?
У меня есть коллекция документов с атрибутом create_date. Я хотел бы отправить эти документы через конвейер агрегации, чтобы поработать над ними. В идеале я хотел бы отфильтровать их, используя $ match, прежде чем выполнять какую-либо другую работу с ними, чтобы я мог воспользоваться индексами, однако я не могу понять, как использовать новые операторы $ year / $ month / $ dayOfMonth в моем $ match expression.
Существует несколько примеров использования операторов в операции $ 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
}
Я хотел бы провести это через конвейер агрегации, чтобы получить общие комментарии ко всем сообщениям, сделанным в сентябре
{
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'}
}
}
]
}