2015-05-14 12 views
6

więc mam kilka prostych dokumentów jakMongoDB Podsumowując wielkość pól tablicy

{ 

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

    "typ": "Organisation", 

} 

i chcę, aby dowiedzieć się ogólnej wielkości związanej foos do dokumentów typu „organizacja”

więc mam tego zapytania kruszywo

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

ta zwraca liczbę wszystkich Foo dla każdego dokumentu

lubię:

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

jest jakiś zapytanie, które zwróci podsumował liczyć na Foo wszystkich dokumentów?

grałem arround z $ sumy, ale nie wiem jak to połączyć z moim zapytaniu, ja tylko nie pojawiają się błędy składniowe, to byłoby fajnie wiedzieć, czy jest to możliwe

Odpowiedz

15

Dołącz $group operatora fazę realizacji po $project krok następująco:

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

tej grupy wszystkie dokumenty wejściowe z poprzedniego etapu i stosuje $project wyrażenie akumulatora $sum na polu fooos w grupie się całkowitej (stosując ostatni przykład):

Wyjście

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

Należy zauważyć, że pole '_id' nie jest konieczne. –

+0

@MarkusWMahlberg Dzięki za zwrócenie na to uwagi. – chridam

+1

Wow, dziękuję bardzo, że działa jak charme! Musiałem dołączyć "foos": {$ ne: null} 'do zapytania $ match, aby uruchomić go –

6

wiem, że to jest stare pytanie, ale można projekt obwodnicy w ogóle, jeśli chcesz, tak jak o tym?

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

Moc wyjściowa pozostaje taka sama i wydaje się, że jest (nieco) szybsza.

Powiązane problemy