MongoDB-Aggregation - Gruppieren von Daten

Sep 23 2020

Ich habe eine MongoDB-Sammlung mit Benutzeraktivitätsdaten (Aktivitätstyp) und möchte Aktivitäten in zwei Gruppen gruppieren und die Anzahl der Aktivitäten zurückgeben.

Die Sammlung sieht ungefähr so ​​aus (es gibt auch einige andere Felder wie Datum usw.):

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

Ich möchte eine Aggregation durchführen, die die Anzahl mehrerer gruppierter Aktivitäten zurückgibt, z. Ich möchte "Wandern" und "Radfahren" als "Erholung" und "Schlafen" und "Lesen" als "Ausruhen" und dann als Anzahl der Aktivitäten seit dem ausgewählten Datum für den angegebenen Benutzer gruppieren:

"recreation": 2
"resting": 3

Was ich tat , war zu entsprechen userIDund date $gtealle Aktivitäten für ausgewählte Benutzer und Zeit versucht , das Zählen zu bekommen, $sum, $project, konnte aber nicht an der Arbeit wie erwartet.

Vielen Dank!

Antworten

varman Sep 23 2020 at 20:29

Sie können $groupmit verwenden$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
          ]
        }
      }
    }
  }
]

Arbeitender Mongo-Spielplatz