0

Я ищу пример кода агрегации mongo, который запрашивает несколько полей из коллекции и группирует пару полей. Моя коллекция:spark-scala-mongo-aggregate: запрос нескольких полей и группы по 2 полям

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

Вышеупомянутая коллекция очень плоская. Я ищу результаты как ниже:

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} 
      .......}} 
    ........ 

Как мы пишем это в рамках агрегации с помощью вложенной $group и $match или любые другие этапы агрегации ..

Любого совета или помощи очень ценятся. Благодарю.

ответ

1

После долгих проб и ошибок, я был в состоянии решить эту проблему в определенной степени. Хотя, это не совсем то, что я искал, но это лучше. Вот что я получил.

{ 
     "_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 
} 

Мой код агрегации:

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} 
) 

Надеется, что это помогает. Благодарю.

1

Использование группы с несколькими полями, как это:

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

Камилла: Спасибо, что вернулись ко мне. Я отредактировал свой пост с более реалистичными полями сбора и тем, что мне нужно достичь. Я ищу код агрегации. в настоящее время я получил это далеко. Я ограничиваю место для США в настоящее время для сокращения набора данных. 'db.events.aggregate ([ {$ match: {$ and: [ {location: 'US'}, {status: 'end'}, {prodId: {$ ne: null}}, { пользователь: {$ пе: NULL}} ]}} , {$ группа: \t { \t \t _id: "$ PRODID", \t \t пользователей: {$ толчок: "$ пользователя"} \t}} , \t {$ out: "eventProdUsersAgg"} ], {allowDiskUse: true} ) '. Но это только дает мне набор пользователей для продукта. – Vamsi

+0

Как мне изменить это, чтобы получить местоположение и дату и в том формате, который я упомянул в своем посте? – Vamsi