0

Ich suche nach Mongo-Aggregation-Code Beispiel, das mehrere Felder aus einer Sammlung abfragt und durch ein paar Felder gruppiert. Meine Sammlung:Spark-Scala-Mongo-Aggregat: Abfrage mehrerer Felder und Gruppen von 2 Feldern

events: 
{ 
_id 
prodId: 
location: 
status: 
user: 
date: 
} 

Die obige Sammlung ist sehr flach. Ich suche Ergebnisse wie die unten:

For status "Completed" (This is a $match condition) 

    {Product: abc 
     {Location: US 
      {user, date} 
      {user, date 
      {user, date} 
      .......} 
     {Location: APAC 
      {user, date} 
      {user, date 
      {user, date} 
      .......}} 
    {Product: XYZ 
     {Location: US 
      {user, date} 
      {user, date 
      {user, date} 
      .......} 
     {Location: APAC 
      {user, date} 
      {user, date 
      {user, date} 
      .......}} 
    ........ 

Wie schreiben wir dies in Aggregation Framework verschachtelten $group und $match oder andere Aggregationsstufen ..

Jede beraten oder Hilfe wird sehr geschätzt. Vielen Dank.

Antwort

1

Nach viel Versuch und Irrtum, ich war in der Lage, dies zu einem gewissen Grad zu lösen. Obwohl es nicht genau das ist, was ich suchte, aber das ist besser. Hier ist, was ich habe.

{ 
     "_id" : { 
       "Product" : "ABC", 
       "location" : "ERU" 
     }, 
     "details" : [ 
       { //Each of this is a unique combination 
         "user" : "XXXX", 
         "date" : ISODate("2015-08-01T09:08:15Z") 
       }, 
       { 
         "user" : "xxxx", 
         "date" : ISODate("2015-08-01T09:03:08Z") 
       }, 
       { 
         "user" : "xxxx", 
         "date" : ISODate("2015-07-20T19:33:57Z") 
       }, 
       { 
         "user" : "xxxx", 
         "date" : ISODate("2015-07-20T19:28:50Z") 
       } 
     ], 
     "count" : 4 
} 
{ 
     "_id" : { 
       "Product" : "AAA", 
       "location" : "US" 
     }, 
     "details" : [ 
       { 
         "user" : "XXXX", 
         "date" : ISODate("2015-08-01T09:08:15Z") 
       }, 
       { 
         "user" : "xxxx", 
         "date" : ISODate("2015-08-01T09:03:08Z") 
       }, 
       { 
         "user" : "xxxx", 
         "date" : ISODate("2015-07-20T19:33:57Z") 
       }, 
       { 
         "user" : "xxxx", 
         "date" : ISODate("2015-07-20T19:28:50Z") 
       } 
     ], 
     "count" : 4 
} 

Mein Aggregationscode:

db.events.aggregate([ 
{$project: 
    { 
     ProdId:1, 
     location:1, 
     username:1, 
     status:1, 
     dateTime:1 
    } 
    } 
, {$group: 
    { 
     _id: {Product: "$prodId", location: "$location"}, 
     details: {$addToSet: {user: "$username", date: "$dateTime"}}, 
     count: {$sum: 1} 
    }} 
],{allowDiskUse: true} 
) 

Hoffnung, das hilft. Vielen Dank.

1

Verwendungsgruppe mit mehreren Feldern wie folgt aus:

db.collection.aggregate([{$group: {attr1:'$attr1', attr2:'$attr2'}}]) 
+0

Camille: Danke, dass du zurück zu mir gekommen bist. Ich habe meine Post mit realistischeren Sammlungsfeldern bearbeitet und was ich erreichen muss. Ich suche nach dem Aggregationscode. momentan bin ich soweit gekommen. Ich beschränke den Standort jetzt auf US, um den Datensatz zu reduzieren. 'db.events.aggregate ([ {$ match: {$ und: [ {location: 'US'}, {status: 'end'}, {prodId: {$ ne: null}}, { Benutzer: {$ ne: null}} ]}} , {$ Gruppe: \t { \t \t _id: "$ ProdID", \t \t Benutzer: {$ Push: "$ user"} \t}} , \t {$ out: "eventProdUsersAgg"} ], {allowDiskUse: true} ) '. Aber das gibt mir nur eine Reihe von Benutzern für ein Produkt. – Vamsi

+0

Wie ändere ich das, um Ort und Datum zu erhalten und in dem Format, das ich in meinem Beitrag erwähnt habe? – Vamsi

Verwandte Themen