Uw code werkt niet, omdat $cond
is geen accumulatoroperator. Alleen deze
accumulator-operators, kunnen worden gebruikt in een $group fase.
Ervan uitgaande dat uw records niet meer dan twee mogelijke waarden van source . bevatten zoals u in uw vraag vermeldt, kunt u een voorwaardelijk $project . toevoegen stage en wijzig de $group podium als,
Code:
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"
]
}
}
}
])
Als er meer dan twee mogelijke waarden voor de bron kunnen zijn, kunt u het volgende doen:
Groupdoor deid,firstName,lastNameencode. Verzamel de unieke waarden vansource, met behulp van de $addToSet operator.- Gebruik $redact
om alleen de andere waarden te behouden dan
email. Projectde verplichte velden, als desourcearray is leeg (alle elementen zijn verwijderd), voeg een waarde toeemailernaartoe.Unwindhet bronveld om het als een veld weer te geven en niet als een array. (optioneel)
Code:
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"
}
}
}
}
])