2015-05-14 20 views
6

yüzdenmongodb dizi sahası büyüklüğünde Özetle

{ 

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

    "typ": "Organisation", 

} 

gibi basit belgeler bir grup var ve ben "Örgütü" türü belgelere ilişkili foos toplam boyutunu bulmak için o kadar

istiyorum ben bu her doküman

için tüm foos sayısını döndürür

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

bu agrega sorgu var

gibi:

{ "_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 } 

tüm belgelerin foos için özetlenebilir sayımı dönecekti bazı sorgu var mı?

i $ toplamı ile civarı oynanan ama, ben sadece sözdizimi hatalarını alırım, mümkün olup olmadığını

cevap

15

$project sonra $group operatör boru hattı aşamasını Dahil bilmek harika olurdu benim sorgu ile birleştirmek dont know how önceki $project sahneden

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

Bu irade grup tüm giriş belgeleri ve (son örneği kullanılarak) toplam almak için grup içinde fooos sahada akümülatör ifadesini $sum geçerlidir:: adım aşağıdaki şekilde

Çıktı

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

Lütfen '_id' alanının gerekli olmadığını unutmayın. –

+0

@MarkusWMahlberg Bunu bildirdiğiniz için teşekkür ederiz. – chridam

+1

Vay, çok teşekkürler, bir charme gibi çalışır! Ben "foos" eklemek gerekiyordu: {$ ne: null} 'çalışmak için koymak için $ match sorguya –

6

Bu eski bir soru olduğunu biliyorum ama olabildiğince bu konuda baypas isterseniz tamamen proje, bu yüzden nasıl?

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

Çıktı aynı kalıyor ve (biraz) daha hızlı görünüyor.