Jeg tror, at denne forespørgsel er en løsning på det, du spørger om:
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}}
])
Der er nogle muligheder med, hvordan du vil se resten af felterne. Jeg valgte at skubbe type2 til et array (tillader dubletter), tag den første værdi for year
og month
da disse altid vil være 2015 og 4 pr. din kamphandling, og addToSet
dagen til et array (der ikke tillade dubletter). En anden mulighed ville være at skubbe hele dokumentet ind i en række matcher, men man skal være forsigtig med det på store samlinger.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},