Estoy atascado en una consulta, mi caso es
if user id exists then user id else if user name exists then user name else if user email exists then user email else ''Aquí está mi código.
$project: { ..... other fields, 'userDetail': { $cond: { if: { $exists: ['$user.id'] }, then: '$user.id', else: { $cond: { if: { $exists: ['$user.name'] }, then: '$user.name', else: { $cond: { if: { $exists: ['$user.email'] }, then: '$user.email', else: '', } }, } } } } }Dado que $exists no funciona en esto. ¿Alguien puede ayudarme a encontrar la solución a este problema? Además, si user.id es '' (cadena vacía) y user.name es "Marcus". Quiero que el resultado devuelva user.name.
Consulta
id es falso o una cadena vacía, intente con el name ; de lo contrario, si el name es falso o una cadena vacía, intente con el email ; de lo contrario, "" * en caso de que realmente necesite $exist por ejemplo, si desea mantener los valores null o false , puede usar {"$eq":[{"$type":"$user.id"}, "missing"]}
aggregate( [{"$set": {"userInfo": {"$switch": {"branches": [{"case":{"$and":["$user.id", {"$ne":["$user.id", ""]}]}, "then":"$user.id"}, {"case":{"$and":["$user.name", {"$ne":["$user.name", ""]}]}, "then":"$user.name"}, {"case":{"$and":["$user.email", {"$ne":["$user.email", ""]}]}, "then":"$user.email"}], "default":""}}}}])Si lo he entendido correctamente (y según su ejemplo), puede usar una consulta como esta:
El truco aquí es usar ifNull en lugar de $exists .
db.collection.aggregate([ { "$project": { "userDetail": { "$cond": [ { "$ifNull": [ "$user.id", false ] }, // user id exists "$user.id", // user id no exists { "$cond": [ { "$ifNull": [ "$user.name", false ] }, // user name exists "$user.name", // user name no exists { "$cond": [ { "$ifNull": [ "$user.email", false ] }, // user email exists "$user.email", // user email no exists "" ] } ] } ] } } } ])Ejemplo aquí
Puede usar el operador $ifNull anidado, al verificar la condición anidada,
{ $project: { userDetail: { $ifNull: [ "$user.id", { $ifNull: [ "$user.name", { $ifNull: ["$user.email", ""] } ] } ] } } }