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:
Group
door deid
,firstName
,lastName
encode
. Verzamel de unieke waarden vansource
, met behulp van de $addToSet operator.- Gebruik $redact
om alleen de andere waarden te behouden dan
email
. Project
de verplichte velden, als desource
array is leeg (alle elementen zijn verwijderd), voeg een waarde toeemail
ernaartoe.Unwind
het 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"
}
}
}
}
])