Estoy tratando de establecer un valor en mi tubería de agregación en función de si algún objeto en una matriz tiene un valor específico establecido en verdadero.
{ $set: { "read": {$cond: {if: {"permissions.publicRead": true}, then: true, else: false}}, "write": false, "owner": false } }Pero se queja de no permitir un "." en el nombre del campo. Los datos se ven algo como esto:
{ "permissions": [ {"publicRead": true}, {"publicRead": false} ] } Editar: también intenté usar $permissions.publicRead y {if: "permissions.publicRead", then: true, else: false}
Motivo del error: $cond requiere verificar la condición en el operador $eq y necesita pasar $ antes $permissions.publicRead en condición,
$cond: { if: { $eq: ["$permissions.publicRead", true] }, then: true, else: false }
Después de resolver el problema anterior, la consulta funcionará sin errores, pero no devolverá el resultado correcto porque permissions.publicRead siempre devolverá una matriz de valores booleanos,
$eq: ["$permissions.publicRead", true]es igual a
$eq: [[true, false], true]o$eq: [[false, true], true]asi que
[true, false]o[false, true]no es igual atrue
Pruebe el operador $anyElementTrue para verificar si la matriz tiene algún valor verdadero o no,
db.collection.aggregate([ { $set: { "read": { $anyElementTrue: "$permissions.publicRead" }, "write": false, "owner": false } } ])