Tengo datos en el siguiente formato:

[{
"OrderId": "406-5309498-5972326",
"revenueHeader": {
"Principal": 982.14,
"Product Tax": 117.86,
"Total": 1100
}},
{
"OrderId": "506-5234568-5934567",
"revenueHeader": {
"Principal": 382.54,
"Product Tax": 34.46,
"Shipping charge": 30.5,
"Giftwrap charge": 27.5,
"Total": 234
}}]

¿Cómo puedo sumar los valores del mapa de ingresosHeader para las claves en todos los documentos? Nota: "Cargo de envío" no está presente en el primer documento, pero aún queremos la suma de esta clave en todos los documentos. Además, las claves pueden variar, no hay forma de saber el nombre de las claves de antemano.

0
Katya047 22 dic. 2019 a las 19:44

2 respuestas

Si no está seguro de cuántos campos habrá para los cuales desea obtener la suma de valores en los documentos, puede ir con la solución dada por @matthPen.

Pero si conoce todos los campos posibles presentes, puede usar directamente la etapa $ group con nombres clave. Como personalmente evito usar $ desenrollar si el número de documentos es muy grande.

[ 
    { 
        $group: { 
            _id: null,
            "Principal": { $sum: "$revenueHeader.Principal" },
            "Product Tax": { $sum: "$revenueHeader.Product Tax" },
            "Shipping charge": { $sum: "$revenueHeader.Shipping charge" },
            "Giftwrap charge": { $sum: "$revenueHeader.Giftwrap charge" },
            "Total": { $sum: "$revenueHeader.Total" },
        } 
    } 
]
0
Abhinandan Kothari 24 dic. 2019 a las 10:30

Tiene que usar $ objectToArray para transformar los ingresos de HeadHader en una matriz de {k, v} objeto.

Luego puede $ desenrollar la matriz y agrupar por ingresosHeader.k, sumando ingresosHeader.v. De esta manera, nunca se ocupa del nombre o la presencia de los campos dentro de IngresosHeader.

Aquí está la consulta:

db.collection.aggregate([
  {
    $project: {
      revenueHeader: {
        $objectToArray: "$revenueHeader"
      }
    }
  },
  {
    $unwind: "$revenueHeader"
  },
  {
    $group: {
      _id: "$revenueHeader.k",
      total: {
        $sum: "$revenueHeader.v"
      }
    }
  }
])

Puede probarlo aquí

1
matthPen 22 dic. 2019 a las 18:30