2017-01-26 2 views
1

den folgenden Datensatz von Ereignisobjekten Gegeben:Mehrere Gruppierungen für MongoDB Aggregate

[ 
 
    { 
 
     "_id": ObjectId("4fda05cb322b1c95b531ac26", 
 
     "title": "BUTTON CLICKED", 
 
     "createdAt": ISODate("2017-01-12T01:00:00+01:00") 
 
    }, 
 
    { 
 
     "_id": ObjectId("1235h1k235h1kl325h1v31gv", 
 
     "title": "BUTTON CLICKED", 
 
     "createdAt": ISODate("2017-01-14T01:00:00+01:00") 
 
    }, 
 
    { 
 
     "_id": ObjectId("c2n890904cn897qnxp23hjk1", 
 
     "title": "PAGE VIEWED", 
 
     "createdAt": ISODate("2017-01-12T02:00:00+01:00") 
 
    } 
 
]

Wie würde ich Gruppe sie nach Datum dann mit Namen?

Das gewünschte Ergebnis würde wie folgt aussehen:

[ 
 
    { 
 
    _id: { year: 2017, month: 1, day: 11 }, 
 
    events: [ { 
 
       title: "BUTTON PRESSED", 
 
       count: 3 
 
       }, { 
 
       title: "PAGE VIEWED", 
 
       count: 2 
 
       } 
 
      ] 
 
    }, 
 
    { 
 
    _id: { year: 2017, month: 1, day: 24 }, 
 
    events: [ { 
 
       title: "BUTTON PRESSED", 
 
       count: 1 
 
       } 
 
      ] 
 
    } 
 
]

Jede Hilfe zu diesem Thema wäre sehr, Sie so viele geschätzt!

Antwort

1

können Sie diese Abfrage versuchen

db.collectionName.aggregate([ 
    $group: { 
     _id : { 
     year : { $year : "$createdAt" }, 
     month : { $month : "$createdAt" }, 
     day : { $dayOfMonth : "$createdAt" }, 
     title: "$title" 
     }, 
     count:{$sum:1} 
     } 
    }, 
    { 
    $group:{ 
     _id:{ 
     year: "$_id.year", 
     month: "$_id.month", 
     day: "$_id.day" 
     }, 
     data:{ 
     $push: { 
      name:"$_id.title", 
      count:"$count" 
     } 
     } 
    } 
    } 
])