Su código no funciona porque $cond
no es un operador acumulador. Solo estos
operadores de acumulador, se pueden usar en un $group escenario.
Suponiendo que sus registros no contengan más de dos valores posibles de source como menciona en su pregunta, podría agregar un $project condicional escenario y modificar el $group etapa como,
Código:
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"
]
}
}
}
])
En caso de que haya más de dos valores posibles para la fuente, podría hacer lo siguiente:
Grouppor elid,firstName,lastNameycode. Acumule los valores únicos desource, utilizando $addToSet operador.- Utilice $redact
para mantener solo los valores que no sean
email. Projectlos campos obligatorios, si lasourcela matriz está vacía (se han eliminado todos los elementos), agregue un valoremaila ella.Unwindel campo fuente para mostrarlo como un campo y no como una matriz. (opcional)
Código:
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"
}
}
}
}
])