Tengo una colección de documentos de User con la siguiente forma:
// User { payments: [ { total: number }, ], } La matriz de payments de documentos anidados de longitud variable contiene totals numéricos con valores iguales o superiores a 0.
¿Cómo encuentro una lista de Users donde la duración de payments con total > 0 es mayor que uno?
Por ejemplo, quiero encontrar documentos como estos:
// two totals > 0 👍 { payments: [ { total: 50 }, { total: 50 }, ], } // two totals > 0 👍 { payments: [ { total: 50 }, { total: 0 }, { total: 50 }, ], } // three totals > 0 👍 { payments: [ { total: 50 }, { total: 50 }, { total: 0 }, { total: 50 }, ], }pero no estos documentos:
// not enough totals > 0 👎 { payments: [ { total: 50 }, { total: 0 }, { total: 0 }, ], } // not enough totals > 0 👎 { payments: [ { total: 0 }, { total: 0 }, ], }¡Gracias por cualquier ayuda de antemano!
Demostración: https://mongoplayground.net/p/AG8Q1GqSEcl
Tienes que usar una consulta de agregación.
matriz de $filtro donde el total es mayor que 0 y obtenga el $tamaño de la matriz filtrada. Comprobar si es mayor que 1 $match
db.collection.aggregate([ { $project: { payments: "$payments", paymentsGreaterThanZero: { $size: { $filter: { input: "$payments", as: "item", cond: { $gt: [ "$$item.total",0 ] } } } } } }, { $match: { paymentsGreaterThanZero: { $gt: 1 } } }, { $project: { payments: "$payments" } } ])