मेरा मानना है कि यह प्रश्न आप जो पूछ रहे हैं उसका समाधान है:
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' }
}},