0

У меня есть записи в коллекции следующего формата.агрегирование mongodb - комбинация запроса разворота/группы/проекта

//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 
          } 
        ] 
      } 
    ]    
} 

Поле "pageNo" содержит повторяющиеся значения. Мне нужно сгруппировать поле pageNo с добавлением их соответствующего «времени».

Это мой требуемый выход. (После того, как «$ разматывает» операция по аналитике)

//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 
          }         
        ]  
      } 
} 

Я пробовал различные комбинации совокупности, группы, расслабиться и проекта, но до сих пор не вполне может попасть и действительно признателен за любые предложения.

+0

Что вы хотите закончить? Вы пытаетесь суммировать «время» с помощью «pageNo» или «time» на «pageNo» для каждого идентификатора аналитики? –

+0

Я хочу суммировать «время» на странице «Нет». –

+0

Я хочу что-то вроде этого. analyticsID1 -> {timeSpent: [{time: 10, pageNo: 1}, ..]}, analyticsID2 -> {timeSpent: [{time: 20, pageNo: 1}, ..]} –

ответ

0

Вот агрегат, который я придумал, чтобы предоставить результат, упомянутый в вашем комментарии выше. Как FYI, чем больше элементов у вас есть в массиве, который нужно разматывать, тем больше использования памяти у вас будет, и это займет экспоненциальное количество времени, основанное на размерах массива. Я бы настоятельно рекомендовал вам структурировать ваши данные по-разному, если ваши массивы не ограничены по длине.

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' 
      } 
     } 
    } 
}, ]; 

Это Выходы:

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

Сюда входит название каждого документа на выходе и форматирует его так, как вы, казалось, задавали в своем предыдущем комментарии. Если вы хотите, чтобы результат был другим, просто дайте мне знать, и я обновлю агрегат. –

+0

Спасибо за разработку решения. Он отлично работал. Я рассматриваю вашу рекомендацию по структурированию данных как второй этап размотки, а затем группировка займет много памяти и времени. –