Ik geloof dat deze vraag een oplossing is voor wat je vraagt:
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}}
])
Er zijn enkele opties met hoe u de rest van de velden wilt zien. Ik heb ervoor gekozen om het type2 naar een array te pushen (waardoor duplicaten mogelijk zijn), neem de eerste waarde voor year
en month
aangezien dat altijd 2015 en 4 zal zijn volgens je wedstrijdoperatie, en addToSet
de dag naar een array (duplicaten zijn niet toegestaan). Een andere optie zou zijn om het hele document in een array van overeenkomsten te duwen, maar daar moet je voorzichtig mee zijn bij grote verzamelingen.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},