मेरा मानना है कि यह प्रश्न आप जो पूछ रहे हैं उसका समाधान है:
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}}
])
आप बाकी क्षेत्रों को कैसे देखना चाहते हैं, इसके साथ कुछ विकल्प हैं। मैंने टाइप 2 को एक सरणी (डुप्लिकेट के लिए अनुमति) में धक्का देना चुना, year के लिए पहला मान लें और month चूंकि वे हमेशा आपके मैच ऑपरेशन के अनुसार 2015 और 4 होंगे, और addToSet एक सरणी के लिए दिन (डुप्लिकेट की अनुमति नहीं)। एक अन्य विकल्प पूरे दस्तावेज़ को मैचों की एक सरणी में धकेलना होगा, लेकिन बड़े संग्रह पर इसके साथ सावधान रहना चाहिए।
{$group: {
_id: { iddoc: '$iddoc', type1: '$type1' },
sum: {$sum: 1},
matches: { $push: '$$ROOT' }
}},