Агрегирование Mongodb: вставка вложенных полей на этапе $ group - PullRequest
0 голосов
/ 30 марта 2020

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

model.aggregate( [ {
  $group: {
    _id: '$groupName,
    nestedFields: {
      field1: {
        $sum: { $multiply: [ '$num1', '$num2'] }
      },
      field2: { $sum: '$num3' }
    }
  }
} ] )

Любая помощь с благодарностью.

редактировать: некоторые образцы данных ВХОД:

{
  "groupName": 1
  "num1": 2,
  "num2": 4,
  "num3": 8,
}
{
  "groupName": 1
  "num1": 2,
  "num2": 7,
  "num3": 1,
}
{
  "groupName": 2
  "num1": 1,
  "num2": 3,
  "num3": 5,
}
{
  "groupName": 2
  "num1": 6,
  "num2": 1,
  "num3": 2,
}

должен ВЫХОД через агрегирование:

{
  "_id": 1,
  "nestedFields": {
    "field1": 22,      // 2*4 + 2*7
    "field2": 9,       // 8 + 1
  }
},
{
  "_id": 2,
  "nestedFields": {
    "field1": 9,      
    "field2": 7,       
  }
}

1 Ответ

1 голос
/ 30 марта 2020

На этапе $group MongoDB не позволяет создавать вложенные поля.

Обходной путь : необходимо сохранить агрегированные значения в обычных полях и на следующем этапе преобразовать в требуемый результат с помощью оператора $project.

model.aggregate([
  {
    $group: {
      _id: "$groupName",
      field1: {
        $sum: {
          $multiply: [
            "$num1",
            "$num2"
          ]
        }
      },
      field2: {
        $sum: "$num3"
      }
    }
  },
  {
    $project: {
      nestedFields: {
        field1: "$field1",
        field2: "$field2"
      }
    }
  }
])

MongoPlayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...