Pregunta

Tengo una colección de mongodb con documentos correspondientes a proyectos de usuarios y que contiene los siguientes elementos relevantes:

{
  "InstanceId": "Instance1",
  "Username": "JohnSmith",
  "ProjectTotals": 
    {
      Subtotal: 100.00
      TaxTotal: 0.000
    }
}

Cada instancia contiene muchos usuarios y cada usuario puede tener muchos proyectos.

Estoy tratando de obtener algunos datos agregados para permitirme mostrar un administrador de instancias El número de proyectos que cada usuario ha creado, así como el costo total de todos los proyectos y el costo promedio del proyecto para cada usuario.

Hasta ahora, he construido la siguiente consulta (que ignora los impuestos por ahora):

db.projects.aggregate( 
{$match: 
    {InstanceId: "Instance1", 
     ProjectTotals:{"$exists":true}     }},
{$group:
    {_id: "$Username", 
        count: { $sum: 1 },
        total: { $sum: "ProjectTotals.SubTotal"},
        average: {$avg: "ProjectTotals.SubTotal"}}})

Esta consulta me da con éxito el recuento para cada usuario, pero el total y el promedio son 0 para cada usuario:

"result" : [ 
    {
        "_id" : "JohnSmith",
        "count" : 10,
        "total" : 0,
        "average" : 0
    }
]

Sin cambiar mi esquema de base de datos, ¿cómo puedo acceder a ProjectTotals.subtotal para las funciones de agregación?

¿Fue útil?

Solución

Necesita $ frente a los proyectos, además de su subtotal mal escrito (es subtotal en su esquema, pero subtotal en su agregación).Haciendo ambas correcciones:

db.projects.aggregate(
                      {$match: {InstanceId: "Instance1", ProjectTotals:{"$exists":true}}},
                      {$group: {_id: "$Username", count: { $sum: 1 },
                           total: {$sum: "$ProjectTotals.Subtotal"}, 
                                    average: {$avg: "$ProjectTotals.Subtotal"}}}
                      )

Ejecutar eso contra los datos de su muestra. Obtengo:

{ "_id" : "JohnSmith", "count" : 1, "total" : 100, "average" : 100 }

que es lo que esperaría de una muestra de datos de 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top