Din kode virker ikke, fordi $cond
er ikke en akkumulatoroperatør. Kun disse
akkumulatoroperatorer, kan bruges i en $group scene.
Forudsat at dine poster ikke indeholder mere end to mulige værdier af source som du nævner i dit spørgsmål, kan du tilføje et betinget $project iscenesætte og ændre $group scene som,
Kode:
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"
]
}
}
}
])
Hvis der kan være mere end to mulige værdier for kilden, kan du gøre følgende:
Groupved hjælp afid,firstName,lastNameogcode. Akkumuler de unikke værdier afsource, ved hjælp af $addToSet operatør.- Brug $redact
for kun at beholde andre værdier end
email. Projectde påkrævede felter, hvissourcearray er tom (alle elementer er blevet fjernet), tilføj avalueemailtil det.Unwindkildefeltet for at angive det som et felt og ikke en matrix.(valgfrit)
Kode:
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"
}
}
}
}
])