0

Ich habe Datensätze in einer Sammlung des folgenden Formats.Mongodb-Aggregation - Abwickeln/Gruppe/Projekt Abfrage Kombination

//One parent record 
{ 
    "_id" : "someDocID", 
    "title" : "some title", 
    "analytics" : [ 
      { 
        "_id" : "analyticsID1", 
        "timeSpent" : [ 
          { 
            "time" : 14, 
            "pageNo" : 1 
          }, 
          { 
            "time" : 4, 
            "pageNo" : 2 
          }, 
          { 
            "time" : 3, 
            "pageNo" : 1 
          }, 
          { 
            "time" : 1, 
            "pageNo" : 2 
          } 
        ]      

      }, 
      {       
        "_id" : "analyticsID2",       
        "timeSpent" : [ 
          { 
            "time" : 12, 
            "pageNo" : 10 
          }, 
          { 
            "time" : 15, 
            "pageNo" : 11 
          }, 
          { 
            "time" : 26, 
            "pageNo" : 12 
          }, 
          { 
            "time" : 13, 
            "pageNo" : 11 
          }, 
          { 
            "time" : 17, 
            "pageNo" : 10 
          }, 
          { 
            "time" : 30, 
            "pageNo" : 11 
          } 
        ] 
      } 
    ]    
} 

Das Feld "SeiteNr" enthält wiederholte Werte. Ich muss das pageNo Feld mit dem Hinzufügen ihrer jeweiligen "Zeit" gruppieren.

Dies ist meine erforderliche Ausgabe. (Nach „$ Abroller“ -Betrieb auf Analytik)

//Two records after "$unwind" on analytics 
{ 
    "_id" : "someDocID", 
    "title" : "some title", 
    "analytics" : { 
        "_id" : "analyticsID1", 
        "timeSpent" : [ 
          { 
            "time" : 17, //14+3 
            "pageNo" : 1 
          }, 
          { 
            "time" : 5, //4+1 
            "pageNo" : 2 
          } 
        ] 
      } 
} 

{ 
    "_id" : "someDocID", 
    "title" : "some title", 
    "analytics" : { 
        "_id" : "analyticsID2", 
        "timeSpent" : [ 
          { 
            "time" : 29, //12+17 
            "pageNo" : 10 
          }, 
          { 
            "time" : 58, //15+13+30 
            "pageNo" : 11 
          }, 
          { 
            "time" : 26, 
            "pageNo" : 12 
          }         
        ]  
      } 
} 

Ich habe verschiedene Kombinationen von Aggregate versucht, Gruppe, entspannen und Projekt kann aber immer noch nicht ganz da bekommen und würde wirklich zu schätzen irgendwelche Vorschläge.

+0

Was wollen Sie mit beenden? Versuchen Sie, "Zeit" mit "SeiteNr" oder "Zeit" mit "SeiteNr" für jede Analyse-ID zu summieren? –

+0

Ich möchte "time" mit "pageNo" summieren. –

+0

Ich möchte so etwas. analyticsID1 -> {timeSpent: [{Zeit: 10, SeiteNr: 1}, ..]}, analyticsID2 -> {timeSpent: [{Zeit: 20, SeiteNr: 1}, ..]} –

Antwort

0

Hier ist ein Aggregat, das ich erstellt habe, um die Ausgabe zu liefern, die Sie in Ihrem Kommentar oben erwähnt haben. Je mehr Elemente Sie in einem Array haben, das abgewickelt werden muss, desto größer ist die Speicherbelegung, die Sie haben werden, und je nach Array-Größe dauert es exponentiell. Ich würde sehr empfehlen, dass Sie Ihre Daten anders strukturieren, wenn Ihre Arrays nicht in der Länge begrenzt sind.

var aggregrate = [{ 
    $unwind: '$analytics' 
}, { 
    $unwind: '$analytics.timeSpent' 
}, { 
    $group: { 
     _id: { 
      analytics_id: '$analytics._id', 
      pageNo: '$analytics.timeSpent.pageNo' 
     }, 
     title:{$first:'$title'}, 
     time: { 
      $sum: '$analytics.timeSpent.time' 
     }, 
    } 
}, { 
    $group: { 
     _id: '$_id.analytics_id', 
     title:{$first:'$title'}, 
     timeSpent: { 
      $push: { 
       time: '$time', 
       pageNo: '$_id.pageNo' 
      } 
     } 
    } 
}, ]; 

Diese Ausgänge:

[{ 
    "_id": "analyticsID1", 
    "title" : "some title", 
    "timeSpent": [{ 
     "time": NumberInt(17), 
     "pageNo": NumberInt(1) 
    }, { 
     "time": NumberInt(5), 
     "pageNo": NumberInt(2) 
    }] 
}, { 
    "_id": "analyticsID2", 
    "title" : "some title", 
    "timeSpent": [{ 
     "time": NumberInt(26), 
     "pageNo": NumberInt(12) 
    }, { 
     "time": NumberInt(29), 
     "pageNo": NumberInt(10) 
    }, { 
     "time": NumberInt(58), 
     "pageNo": NumberInt(11) 
    }] 
}] 
+0

Dies beinhaltet den Titel jedes Dokuments in der Ausgabe und formatiert es so, wie Sie in Ihrem obigen Kommentar zu fragen schienen. Wenn Sie möchten, dass die Ausgabe anders ist, lassen Sie es mich wissen und ich werde das Aggregat aktualisieren. –

+0

Danke für die Herstellung der Lösung. Es hat super funktioniert. Ich denke über Ihre Empfehlung nach, die Daten als zweite Phase des Abwickelns zu strukturieren und dann wird die Gruppierung viel Speicher und Zeit in Anspruch nehmen. –