Domanda

Ho una collezione MongoDB con documenti corrispondenti a progetti utente e contenenti i seguenti elementi pertinenti:

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

Ogni istanza contiene molti utenti e ogni utente può avere molti progetti.

Sto cercando di ottenere alcuni dati aggregati per consentirmi di mostrare un gestore di istanza il numero di progetti che ogni utente ha creato così come il costo totale di tutti i progetti e il costo medio del progetto per ogni utente.

Finora, ho costruito la seguente query (che ignora le tasse per ora):

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

Questa query mi dà correttamente il conteggio per ciascun utente, ma il totale e la media sono 0 per ogni utente:

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

Senza modificare il mio schema del database, come posso accedere a ProjecTtotals.Subbotale per le funzioni di aggregazione?

È stato utile?

Soluzione

Hai bisogno di $ di fronte ai ProjectTotals Plus You Bisardspelled Subtotal (è sottototale nel tuo schema ma sottototale nella tua aggregazione).Effettuare entrambe le correzioni:

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

Esecuzione che contro i tuoi dati di esempio ottengo:

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

che è ciò che mi aspetterei da un campione di dati di 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top