Tôi tin rằng truy vấn này là một giải pháp cho những gì bạn đang hỏi:
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}}
])
Có một số tùy chọn với cách bạn muốn xem phần còn lại của các trường. Tôi đã chọn đẩy type2 vào một mảng (cho phép trùng lặp), lấy giá trị đầu tiên cho year
và month
vì chúng sẽ luôn là 2015 và 4 cho mỗi thao tác đối sánh của bạn và addToSet
ngày thành một mảng (không cho phép trùng lặp). Một tùy chọn khác sẽ là đẩy toàn bộ tài liệu vào một mảng đối sánh, nhưng bạn nên cẩn thận với điều đó trên các bộ sưu tập lớn.
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},