Estoy tratando de proyectar un valor en mi tubería de agregación en función de si alguna matriz en una matriz contiene un valor específico.
Esta es una versión simplificada de cómo se ven los datos:
[ { "permissions": [ { "owners": [ "1" ] } ] }, { "permissions": [ { "owners": [ "2", "3" ] } ] } ]Y traté de hacer lo siguiente (siendo "2" el valor de ejemplo que estoy buscando):
{ "$project": { owner: { $cond: { if: { $in: [ "2", "$permissions.owners" ] }, then: true, else: false } } } }Pero siempre acaba siendo falso. ¿Algunas ideas?
El problema es que $permissions.owners es una matriz anidada. Verifique este ejemplo para ver eso.
Así que tienes que $unwind la matriz. Pero, si solo hay una matriz, puede buscar en la primera posición en la matriz como esta
Pero, suponiendo que podría haber muchas matrices, puede usar esta consulta.
$unwind la matriz para separar cada valor.$set el valor en la variable del owner si existe el número 2.$group para obtener valores nuevamente. En este punto, existe una variable llamada owner que es una matriz booleana. Entonces, el siguiente paso es similar a la consulta que tiene.
$set de nuevo para saber si existe true en cualquier valor, por lo que la variable también será verdadera. db.collection.aggregate([ { "$unwind": "$permissions" }, { "$set": { "owner": { "$in": [ "2", "$permissions.owners" ] } } }, { "$group": { "_id": "$_id", "permissions": { "$push": "$permissions" }, "owner": { "$push": "$owner" } } }, { "$set": { "owner": { "$in": [ true, "$owner" ] } } } ])Ejemplo aquí