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