2013-07-30 16 views
6

Mam kolekcję, która wygląda mniej więcej tak:Zastosowanie ramy agregacja MongoDB do grupy o długości tablicy

{ 
    "_id": "id0", 
    "name": "...", 
    "saved_things": [ 
     { ... }, 
     { ... }, 
     { ... }, 
    ] 
} 
{ 
    "_id": "id1", 
    "name": "...", 
    "saved_things": [ 
     { ... }, 
    ] 
} 
{ 
    "_id": "id2", 
    "name": "...", 
    "saved_things": [ 
     { ... }, 
    ] 
} 

etc ...

chcę użyć ramy agregacji MongoDB w celu wystąpienia z wynikiem histogramu, który informuje, ilu użytkowników ma określoną liczbę: saved_things.

{ "_id": 1, "count": 2 }, 
{ "_id": 3, "count": 1 } 

Ja próbowałem różnych kombinacji funkcji agregujących jak poniżej, ale żaden nie działał poprawnie, na przykład: dla zbioru danych powyżej mogłoby coś takiego powrotu. (Mam wrażenie, że będę o tym bardzo źle.)

collection.aggregate([ 
    { $unwind: "$saved_things" }, 
    { $group: "$_id", count: { $sum: 1 } } }, 
    { $group: "$count", number: { $sum: 1 } } }, 
    { $sort: { number: -1 } } 
], function(err, result) { 
    console.log(result); 
}); 

Czy to możliwe z kruszywa ramach Mongo lub I byłoby lepiej z mapą funkcji zmniejszyć?

+0

Co masz na myśli mówiąc, że wielu użytkowników ma określoną liczbę subcollectin_ saved_things? Biorąc pod uwagę 'saved_thing', chcesz wiedzieć, którzy użytkownicy mają' saved_things' i ile? Czy to? –

+0

Hmm moje sformułowanie wydaje się być mylące, przepraszam za to! Myślę, że przykładowy wynik najlepiej opisuje to, czego szukam, ale spróbuję opisać to jeszcze raz. Chciałbym uzyskać liczbę obiektów w 'saved_things' dla każdego użytkownika w kolekcji i zsumować częstotliwość tej liczby. Służy do generowania histogramu liczby '' saved_things 'użytkownika (jeśli ma to sens). Daj mi znać, jeśli to nadal będzie mylące. –

Odpowiedz

5

Ok, rozumiem! No to ruszamy. Agregacja rurociąg jest w zasadzie, że:

{ 
    $unwind: "$saved_things" 
}, 
{ 
    $group: { 
     _id: "$_id", 
     size: { 
      $sum: 1 
     } 
    } 
}, 
{ 
    $group: { 
     _id: "$size", 
     frequency: { 
      $sum: 1 
     } 
    } 
}, 
{ 
    $project: { 
     size: "$_id", 
     frequency: 1, 
     _id: 0 
    } 
} 

Unwind saved_things tablicą, następnie grupa Pismem _id i liczyć to, co możemy osiągnąć rozmiar tablicy. Teraz łatwo, pogrupuj według size i policz częstotliwość. Użyj projektu do zmiany nazwy pola _id na size.

+0

Wygląda na to, że jest naprawdę blisko. Otrzymuję to jako wynik: https://gist.github.com/stevenleeg/2b1a2ee9c5400f5f3089 –

+0

Żartuję! Powtarzałem "wyniki", a nie "wynik", który spowodował problem. Jedyne, co widzę, to niezupełnie działa to, że nie ma danych dla częstotliwości 0. Czy jest coś, co można z tym zrobić? –

+0

Nie sądzę, aby ta agregacja zawierała wartość częstotliwości dla dokumentów o macierzy zerowej długości. Drapałam głowę przez chwilę, dlaczego moje sumy częstotliwości nie pasowały do ​​mojej konkretnej kolekcji. – steveinatorx

Powiązane problemy