आपका कोड काम नहीं करता, क्योंकि $cond
संचायक ऑपरेटर नहीं है। केवल ये
संचायक संचालकों का उपयोग $group
. में किया जा सकता है मंच।
मान लें कि आपके रिकॉर्ड में source
. के दो से अधिक संभावित मान नहीं हैं जैसा कि आपने अपने प्रश्न में उल्लेख किया है, आप एक सशर्त जोड़ सकते हैं $project
$group
. को चरणबद्ध और संशोधित करें मंच के रूप में,
कोड:
db.customer.aggregate([
{
$group: {
"_id": {
"id": "$id",
"firstName": "$firstName",
"lastName": "$lastName",
"code": "$code"
},
"sourceA": { $first: "$source" },
"sourceB": { $last: "$source" }
}
},
{
$project: {
"source": {
$cond: [
{ $eq: ["$sourceA", "email"] },
"$sourceB",
"$sourceA"
]
}
}
}
])
यदि स्रोत के लिए दो से अधिक संभावित मान हो सकते हैं, तो आप निम्न कार्य कर सकते हैं:
Group
id
. द्वारा ,firstName
,lastName
औरcode
.source
. के अद्वितीय मान संचित करें , $addToSet का उपयोग करके ऑपरेटर।- $redact का इस्तेमाल करें
email
. के अलावा केवल अन्य मान रखने के लिए । Project
आवश्यक फ़ील्ड, यदिsource
सरणी खाली है (सभी तत्वों को हटा दिया गया है), avalue जोड़ेंemail
इसके लिए।Unwind
स्रोत फ़ील्ड को एक फ़ील्ड के रूप में सूचीबद्ध करने के लिए और एक सरणी के रूप में नहीं। (वैकल्पिक)
कोड:
db.customer.aggregate([
{
$group: {
"_id": {
"id": "$id",
"firstName": "$firstName",
"lastName": "$lastName",
"code": "$code"
},
"sourceArr": { $addToSet: { "source": "$source" } }
}
},
{
$redact: {
$cond: [
{ $eq: [{ $ifNull: ["$source", "other"] }, "email"] },
"$$PRUNE",
"$$DESCEND"
]
}
},
{
$project: {
"source": {
$map: {
"input":
{
$cond: [
{ $eq: [{ $size: "$sourceArr" }, 0] },
[{ "source": "item" }],
"$sourceArr"]
},
"as": "inp",
"in": "$$inp.source"
}
}
}
}
])