2015-05-14 17 views
6

quindi ho un mucchio di documenti semplici comeMongoDB somma delle dimensioni dei campi di matrice

{ 

    "foos": [ 
    ObjectId("5105862f2b5e30877c685c58"), 
    ObjectId("5105862f2b5e30877c685c57"), 
    ObjectId("5105862f2b5e30877c685c56"), 
    ], 

    "typ": "Organisation", 

} 

e voglio scoprire la dimensione complessiva del associata foos ai documenti di tipo "Organizzazione"

così ho questa query di aggregazione

db.profil.aggregate(
    [ 
    { 
    $match:{ 
    "typ":"Organisation" 
    } 
    }, 
     { 
     $project: { 
      fooos: { $size: "$foos" } 
     } 
     } 
    ] 
) 

questo restituisce il conteggio di tutti i Foos per ogni documento

piace:

{ "_id" : ObjectId("50e577602b5e05e74b38a6c8"), "foooos" : 1 } 
{ "_id" : ObjectId("51922170975a09f363e3eef5"), "foooos" : 3 } 
{ "_id" : ObjectId("51922170975a09f363e3eef8"), "foooos" : 2 } 
{ "_id" : ObjectId("5175441d975ae346a3a8dff2"), "foooos" : 0 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee9"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eeeb"), "foooos" : 3 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee4"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee6"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eedb"), "foooos" : 2 } 
{ "_id" : ObjectId("51922174975a09f363e3ef4a"), "foooos" : 1 } 
{ "_id" : ObjectId("5192216f975a09f363e3eee1"), "foooos" : 1 } 
{ "_id" : ObjectId("5192216e975a09f363e3eed7"), "foooos" : 2 } 
{ "_id" : ObjectId("5192216f975a09f363e3eeee"), "foooos" : 3 } 

c'è qualche query che sarebbe tornato il conteggio riassunto per foos di tutti i documenti?

ho giocato arround con $ somma, ma non so come si combinano con la mia domanda, faccio solo ottenere errori di sintassi, che sarebbe stato bello sapere se questo è possibile

risposta

15

Includere la fase gasdotto $group operatore dopo la $project passo come segue:

db.profil.aggregate([ 
    { 
     "$match":{ "typ": "Organisation" } 
    }, 
    { 
     "$project": { 
      "fooos": { "$size": "$foos" } 
     } 
    }, 
    { 
      "$group": { 
       "_id": null, 
       "count": { 
        "$sum": "$fooos" 
       } 
      } 
    } 
]) 

questo gruppo tutti i documenti in ingresso dalla precedente $project palco e si applica l'espressione dell'accumulatore $sum sul campo fooos all'interno del gruppo di ottenere il totale (utilizzando il vostro ultimo esempio):

uscita

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : null, 
      "count" : 24 
     } 
    ], 
    "ok" : 1 
} 
+0

Si noti che il campo '_id' non è necessario. –

+0

@MarkusWMahlberg Grazie per averlo notato. – chridam

+1

wow, grazie mille funziona come un fascino! dovevo includere '" foos ": {$ ne: null}' alla query $ match per metterlo in funzione –

6

So che questa è una vecchia questione, ma è in grado di proiettare bypass del tutto, se si vuole, così come su questo?

db.profil.aggregate([ 
{ 
    "$match":{ "typ": "Organisation" } 
}, 
{ 
    "$group": 
    { 
     "_id": null, 
     "count": 
     { 
      "$sum": { "$size": "$foos" } 
     } 
    } 
}]) 

L'uscita rimane la stessa e sembra che sia (leggermente) più veloce.

Problemi correlati