Как получить среднее значение всех полей внутри встроенного объекта в mongodb? - PullRequest
0 голосов
/ 27 июня 2019

Необходимо получить среднее значение всех полей внедренного объекта, но у каждого объекта есть свой встроенный объект. Итак, во-первых, нужно получить среднее значение внутреннего вложенного объекта.

Попробовал несколько вариантов. Но не получая желаемого результата.

  [{
$project: {
    vals: {
        $objectToArray: "$values"
    }
}
}, {
$unwind: {
    path: "$vals",
}
}, {
$project: {
    valInner: {
        $objectToArray: "$vals.v"
    }
}
}, {
$group: {
    _id: "$valInner.k",
    avg: {
        $avg: "$valInner.v"
    }
}
}]

JSON выглядит так:

 {
  "_id": {
 "$oid": "5cf8132d528a1809fc6bad64"
  },
 "values": {
  "0": {
     "0": 0,
     "1": 0,
     "2": 0,
     "3": 0,
     "4": 10,
     "5": 20,
     "6": 0,
     "7": 10,
     "8": 0,
     "9": 0,
     "10": 0,
     "11": 0,
      ...
      ...
      ...
      "57": 0,
      "58": 0,
      "59": 0
     },
"1": {},
"2": {},
 ...
"60": {}
},
 "event_hour": {
"$date": "2019-06-05T19:16:02.524+0000"
}
}

Ожидаемый результат после агрегации должен быть:

   {
 "_id": {
 "$oid": "5cf8132d528a1809fc6bad64"
},
 "values": avgValue,
 "event_hour": {
  "$date": "2019-06-05T19:16:02.524+0000"
}
}

1 Ответ

0 голосов
/ 28 июня 2019

Решено с помощью следующих этапов в конвейере.

1) Проектирование и преобразование первичного объекта в массив.2) Размотайте этот массив.3) Проецировать и преобразовать внутренний внедренный объект в массив.4) Размотайте это.5) Сгруппируйте его по идентификатору и рассчитайте среднее.

[
 {$project: {values : {$objectToArray : "$values"}}}, 
 {$unwind: {path: "$values"}},
 {$project: {values:{$objectToArray:"$values.v"}}}, 
 {$unwind: {path: "$values"}}, 
 {$group: {_id: "$_id",hour_avg: {$avg:"$values.v"}}}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...