Вярвам, че това запитване е решение за това, което питате:
db.test.aggregate([
// Filter the docs based on your criteria
{$match: {
type1: {$in: ['type1A', 'type1B']},
type2: {$in: ['type2A', 'type2B']},
'date.year': 2015,
'date.month': 4,
'date.type': 'day',
'date.day': {$gte: 4, $lte: 7}
}},
// Group by iddoc and type1 and count them
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
type2: { $push: '$type2' },
year: { $first: '$date.year' },
month: { $first: '$date.month' },
day: { $addToSet: '$date.day' }
}},
// Sort by sum, descending
{$sort: {sum: -1}}
])
Има някои опции за това как искате да видите останалите полета. Избрах да насоча type2 към масив (позволявайки дубликати), да взема първата стойност за year
и month
тъй като те винаги ще бъдат 2015 и 4 за вашата операция за съвпадение и addToSet
деня в масив (без да се допускат дубликати). Друг вариант е да поставите целия документ в масив от съвпадения, но трябва да внимавате с това при големи колекции.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},