Ich glaube, dass diese Abfrage eine Lösung für Ihre Frage ist:
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}}
])
Es gibt einige Optionen, wie Sie die restlichen Felder sehen möchten. Ich habe mich entschieden, den Typ2 in ein Array zu verschieben (wodurch Duplikate möglich sind), und nehme den ersten Wert für year
und month
da dies immer 2015 und 4 für Ihre Match-Operation und addToSet
sein werden Tag in ein Array (ohne Duplikate zuzulassen). Eine andere Möglichkeit wäre, das gesamte Dokument in ein Array von Übereinstimmungen zu schieben, aber man sollte damit bei großen Sammlungen vorsichtig sein.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},