Монго БД (узел js) группируется по датам и сумме значений уникальных идентификаторов - PullRequest
0 голосов
/ 26 сентября 2018

В моей коллекции есть следующие документы:

{
  "_id": ObjectId("5b8fed64b77d7829788ebdc8"),
  "valueId": "6e01c881-c15e-b754-43bd-0fe7381cc02a",
  "value": 14,
  "date": "2018-09-05T14:51:11.427Z"
}

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

myCollection.aggregate([
    {
        $match: {
            date: {
                $gte: start,
                $lte: end,
            },
        },
    },
    {
        $group: {
            _id: {
                $toDate: {
                    $subtract: [{ $toLong: '$date' }, { $mod: [{ $toLong: '$date' }, interval] }],
                },
            },
            valueId: { $addToSet: '$valueId' },
        },
    },
    {
        $project: {
            _id: 1,
            valueId: 1,
        },
    },
]);

Что выдает что-то вроде этого:

{
  _id: 2018-09-04T15:45:00.000Z,
  valueId:[
    'cb255343-9c16-f495-9c29-3697d6c7d6cb',
    '97e729aa-7b0f-c107-d591-01188b768a7a'
  ]
}

Как мне получить что-то вроде этого (упрощенное с одним значением):

{
  _id: 2018-09-04T15:45:00.000Z,
  valueId: [[
    'cb255343-9c16-f495-9c29-3697d6c7d6cb',
    <sum of value>
  ]]
}

РЕДАКТИРОВАТЬ: Endsolution:

myCollection.aggregate([
  {"$match":{"date":{"$gte":start,"$lte":end}}},
  {"$group":{
    "_id":{
      "interval":{"$toDate":{"$subtract":[{"$toLong":"$date"},{"$mod":[{"$toLong":"$date"},interval]}]}},
      "valueId":"$valueId"
    },
    "value":{"$sum":"$value"}
  }},
  { $group: {
        _id: "$_id.interval",
        values: {
           $addToSet: { id: "$_id.valueId", sum: "$value" },}
            }}])

1 Ответ

0 голосов
/ 26 сентября 2018

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

myCollection.aggregate([
  {"$match":{"date":{"$gte":start,"$lte":end}}},
  {"$group":{
    "_id":{
      "interval":{"$toDate":{"$subtract":[{"$toLong":"$date"},{"$mod":[{"$toLong":"$date"},interval]}]}},
      "valueId":"$valueId"
    },
    "value":{"$sum":"$value"}
  }},
  {"$group":{
    "_id":"$_id.interval",
    "valueId":{"$push":{"id":"$_id.valueId","sum":"$value"}}
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...