Agregacja MongoDB - grupowanie danych

Sep 23 2020

Mam kolekcję MongoDB zawierającą dane o aktywności użytkownika (typ aktywności) i chciałbym pogrupować działania na dwie grupy i zwrócić liczbę działań.

Kolekcja wygląda mniej więcej tak (są też inne pola jak data itp.):

{"userID": 1, "activity": "reading"}
{"userID": 1, "activity": "sleeping"}
{"userID": 1, "activity": "hiking"}
{"userID": 1, "activity": "sleeping"}
{"userID": 1, "activity": "biking"}

Chcę zrobić agregację, która zwróci liczbę wielu zgrupowanych działań, np. Chciałbym pogrupować „wędrówki” i „jazda na rowerze” jako „rekreacja”, a „spanie” i „czytanie” jako „odpoczynek”, a następnie liczbę czynności od wybranej daty dla określonego użytkownika:

"recreation": 2
"resting": 3

Co zrobiłem było dopasować userIDi date $gteuzyskać wszystkie zajęcia dla wybranego użytkownika i okres, próbuje liczenia $sum, $projectale nie mógł dostać się do pracy, jak oczekiwano.

Dzięki!

Odpowiedzi

varman Sep 23 2020 at 20:29

Możesz używać $groupz$cond

[
  {
    $group: { _id: "$userID",
      recreation: {
        $sum: { $cond: [
            {
              $or: [ {$eq: ["$activity","hiking"]}, {$eq: ["$activity","biking"]} ] }, 1, 0 ] } }, resting: { $sum: {
          $cond: [ { $or: [
                {$eq: ["$activity","sleeping"]},
                {$eq: ["$activity","reading"]}
              ]
            },
            1,
            0
          ]
        }
      }
    }
  }
]

Działający plac zabaw Mongo