Jag tror att den här frågan är en lösning på det du frågar:
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}}
])
Det finns några alternativ med hur du vill se resten av fälten. Jag valde att skjuta typ2 till en array (medger dubbletter), ta det första värdet för year
och month
eftersom de alltid kommer att vara 2015 och 4 per din matchning, och addToSet
dagen till en array (som inte tillåter dubbletter). Ett annat alternativ skulle vara att skjuta in hela dokumentet i en array av matchningar, men man bör vara försiktig med det på stora samlingar.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},