es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sumar condicionalmente valores en el pipeline del proyecto de Mongo.

Estoy tratando de agregar en una canalización de proyectos donde los valores son mayores que 100, los valores son campos dentro de un objeto que son parte de un arreglo. Tengo algo como esto:

Base de datos:

—Colección de clientes—

client: {
_id: 1,
taxID: aldsfkjasdlñfk
// otras cosas
}

—Colección de facturas—

invoice: {
_id: 1,
clientID: 1,
total: 50
},
invoice: {
_id: 2,
clientID: 1,
total: 150
},
invoice: {
_id: 3,
clientID: 1,
total: 200
}

Y ESTA ES MI CONSULTA:

{
$lookup: {
from: 'invoices',
localField: '_id',
foreignField: 'client.id',
as: 'invoices'
}
},
{
$project: {
id: 1,
taxID: aldsfkjasdlñfk,
invoicesAmountGreaterThanOneHundred: {
$sum: {
$cond: { if: { $gte: ['$invoices.total', 100] }, then: '$invoices.total', else: 0 }
}
}
}
}

Entonces la salida debería ser:

{
_id: 1.
taxID: aldsfkjasdlñfk,
invoicesAmountGreaterThanOneHundred: 350
}

Estoy usando Mongo 3.6.3.

También en el futuro agregaré un “invoicesAmountLesserThanOneHundred”, el mismo método, pero para valores menores que 100 por supuesto.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar un pipeline que filtre los valores menores a 100, puedes modificar la expresión $cond dentro del operador $sum de la siguiente manera:

    {
         $project: {
              id: 1,
              taxID: aldsfkjasdlñfk,
              invoicesAmountGreaterThanOneHundred: {
                   $sum: {
                       $cond: { if: { $gte: ['$invoices.total', 100] }, then: '$invoices.total', else: 0 }
                   }
              },
              invoicesAmountLesserThanOneHundred: {
                   $sum: {
                       $cond: { if: { $lt: ['$invoices.total', 100] }, then: '$invoices.total', else: 0 }
                   }
              }
         }
    }
    

    Esto te dará una salida que se verá así:

    {
         _id: 1,
         taxID: aldsfkjasdlñfk,
         invoicesAmountGreaterThanOneHundred: 350,
         invoicesAmountLesserThanOneHundred: 50
    }
    

Comments are closed.