Je pense que cette requête est une solution à ce que vous demandez :
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}}
])
Il y a quelques options avec la façon dont vous voulez voir le reste des champs. J'ai choisi de pousser le type2 dans un tableau (autorisant les doublons), prendre la première valeur pour year
et month
puisque ceux-ci seront toujours 2015 et 4 par votre opération de correspondance, et addToSet
le jour dans un tableau (ne permettant pas les doublons). Une autre option serait de pousser le document entier dans un tableau de correspondances, mais il faut être prudent avec cela sur les grandes collections.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},