De acuerdo, necesito actualizar los documentos en función de los valores de sus valores de propiedad anidados. Supongamos que tengo este documento:
{ "_id": "61e3050a465c380aec9f56a1", "name": "John Doe", "status": "pending", "payment": [ { "status": "completed" }, { "status": "completed" } ] } Necesito encontrar documentos donde se completed todo el estado de payment.status y cuando se encuentren documentos, entonces necesito actualizar el status externo a completado.
Puedo hacer esto en varias consultas y filtrar las que están completas, pero genera muchas consultas en función de la cantidad de documentos, lo que creo que no es eficiente en términos de rendimiento. Entonces, lo que estaba pensando es si hay una manera de hacerlo en una consulta, puede ser con Aggregate .
Aquí está mi implementación:
let orders = await Orders.find( {} ).populate( 'payments' ); let completedOrders = orders.filter( ( order ) => order.payments.every( ( payment ) => payment.status === 'completed' ) ); if ( completedOrders.length !== 0 ) { for ( let order of completedOrders ) { await Orders.findByIdAndUpdate( order._id, { "status": "completed" } ); } }Puede hacer una actualización con canalización de agregación. Use $map para crear una matriz booleana para indicar si el estado de payment.status está "completado". Luego use $allElementsTrue con $cond para actualizar condicionalmente el campo de status externo.
db.collection.update({}, [ { "$addFields": { "status": { "$cond": { "if": { "$allElementsTrue": { "$map": { "input": "$payment.status", "as": "s", "in": { $eq: [ "$$s", "completed" ] } } } }, "then": "completed", "else": "$status" } } } } ])Aquí está el parque infantil de Mongo para su referencia.