2013-02-03 14 views
5

Come ottengo i commenti totali nella raccolta se la mia raccolta ha questo aspetto. (non i commenti totali per post, ma totale per la raccolta.)ottiene il totale dei documenti secondari in una raccolta

{ 
    _id: 1, 
    post: 'content', 
    comments: [ 
     { 
      name: '', 
      comment: '' 
     } 
    ] 
} 

Se ho posta A con 3 commenti e post B con 5 commenti. Il risultato dovrebbe essere 8.

risposta

12

È possibile utilizzare il aggregation framework:

> db.prabir.aggregate(
    { $unwind : "$comments" }, 
    { $group: { 
     _id: '', 
     count: { $sum: 1 } 
    } 
}) 
{ "result" : [ { "_id" : "", "count" : 8 } ], "ok" : 1 } 

In poche parole questo (temporaneamente) crea un documento separato per ogni commento e quindi incrementa count per ogni documento.


Per un gran numero di post e commenti che potrebbe essere più efficiente per tenere traccia del numero di commenti. Quando si aggiunge un commento, si incrementa anche un contatore. Esempio:

// Insert a comment 
> comment = { name: 'JohnDoe', comment: 'FooBar' } 
> db.prabir.update(
    { post: "A" }, 
    { 
     $push: { comments: comment }, 
     $inc: { numComments: 1 } 
    } 
) 

Utilizzando ancora una volta il quadro di aggregazione:

> db.prabir.aggregate(
    { $project : { _id: 0, numComments: 1 }}, 
    { $group: { 
     _id: '', 
     count: { $sum: "$numComments" } 
    } 
}) 
{ "result" : [ { "_id" : "", "count" : 8 } ], "ok" : 1 } 
+0

Sono nuovo di MongoDB. Quel codice per ottenere un conteggio semplice ... è orribile. – otocan

8

È possibile utilizzare il metodo aggregate del aggregation framework per questo:

db.test.aggregate(
    // Only include docs with at least one comment. 
    {$match: {'comments.0': {$exists: true}}}, 
    // Duplicate the documents, 1 per comments array entry 
    {$unwind: '$comments'}, 
    // Group all docs together and count the number of unwound docs, 
    // which will be the same as the number of comments. 
    {$group: {_id: null, count: {$sum: 1}}} 
); 

UPDATE

Come di MongoDB 2.6, c'è un modo più efficiente per farlo utilizzando l'operatore di aggregazione $size per ottenere direttamente il numero di commenti in ciascun documento:

db.test.aggregate(
    {$group: {_id: null, count: {$sum: {$size: '$comments'}}}} 
); 
Problemi correlati