Saya percaya bahwa kueri ini adalah solusi untuk apa yang Anda tanyakan:
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}}
])
Ada beberapa opsi dengan cara Anda ingin melihat bidang lainnya. Saya memilih untuk mendorong type2 ke array (memungkinkan duplikat), ambil nilai pertama untuk year
dan month
karena itu akan selalu 2015 dan 4 per operasi pencocokan Anda, dan addToSet
hari ke array (tidak mengizinkan duplikat). Opsi lainnya adalah mendorong seluruh dokumen ke dalam array yang cocok, tetapi kita harus berhati-hati dengan itu pada koleksi besar.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},