एकत्रीकरण ढांचे के साथ अपनी आवश्यकताओं को प्राप्त करने के लिए, पहला पाइपलाइन चरण एक $match
होगा विचाराधीन यात्री पर ऑपरेशन जो यात्री सरणी में उपयोगकर्ता के साथ दस्तावेज़ों से मेल खाता है, उसके बाद $unwind
ऑपरेशन जो प्रत्येक तत्व के लिए एक दस्तावेज़ को आउटपुट करने के लिए पिछले ऑपरेशन में इनपुट दस्तावेज़ों से यात्रियों की सरणी को डीकंस्ट्रक्ट करता है। एक और $match
deconstructed सरणी पर संचालन इस प्रकार है कि आगे पिछले दस्तावेज़ स्ट्रीम को फ़िल्टर करता है ताकि केवल मिलान करने वाले दस्तावेज़ों को अगले पाइपलाइन चरण में असंशोधित पास किया जा सके, जो आवश्यक फ़ील्ड को $project
के साथ प्रोजेक्ट कर रहा है। ऑपरेटर। तो अनिवार्य रूप से user3
. के लिए आपकी एकत्रीकरण पाइपलाइन इस तरह होगा:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$project": {
"_id": 0,
"driver": "$driver",
"times": "$passengers.times"
}
}
])
परिणाम :
/* 0 */
{
"result" : [
{
"driver" : "user1",
"times" : 3
},
{
"driver" : "user2",
"times" : 2
}
],
"ok" : 1
}
अपडेट करें :
अलग-अलग तिथियों वाले ड्राइवरों पर डुप्लीकेट समूह बनाने के लिए, जैसा कि आपने उल्लेख किया है, आप $group
कर सकते हैं पिछले $project
. से ठीक पहले ऑपरेशन पाइपलाइन चरण जहां आप $sum
. का उपयोग करके यात्रियों के कुल समय की गणना करते हैं ऑपरेटर:
db.collection.aggregate([
{
"$match": {
"passengers.user": "user3"
}
},
{
"$unwind": "$passengers"
},
{
"$match": {
"passengers.user": "user3"
}
},
{
"$group": {
"_id": "$driver",
"total": {
"$sum": "$passengers.times"
}
}
},
{
"$project": {
"_id": 0,
"driver": "$_id",
"total": 1
}
}
])
परिणाम :
/* 0 */
{
"result" : [
{
"total" : 2,
"driver" : "user2"
},
{
"total" : 3,
"driver" : "user1"
}
],
"ok" : 1
}