Как использовать агрегат для создания группы в mongoDB - PullRequest
1 голос
/ 13 апреля 2020

Пожалуйста, просмотрите образец JSON данных.

{  Id: 2, Type: 4, platform: 3 }
{  Id: 1, Type: 3, platform: 1 }
{  Id: 1, Type: 2, platform: 3 }
{  Id: 1, Type: 3, platform: 3 }

Сначала я хочу сгруппировать по идентификатору, затем сгруппировать по платформе
, как это Или лучше использовать презентацию:

{ 
  '1': {              // id
        '1': {        // platform
              '3':1   // Type : Type's count
             },
        '3': {        // platform
              '2':1,
              '3':1
             }
       }
}

Я использую mongoDB 3.6, это возможно?
спасибо.

1 Ответ

0 голосов
/ 13 апреля 2020

Невозможно с v3.6.

Причина: Для преобразования в key:value [где key должен быть String] объект, нам нужно использовать Оператор $ arrayToObject .

Поскольку значения platform, Type, Id являются Numeric, мы не можем преобразоваться в структуру key:value, поскольку $ toString доступно с v4.0.

Обходной путь: Мы можем создать массив с литералом, эквивалентным значениям platform, Type и Id. Или мы можем использовать оператор $ switch , чтобы вручную определить, как преобразовать числа в эквивалентное литеральное значение.

db.collection.aggregate([
  {
    $addFields: {
      converter: ["0","1","2","3","4","5"] // add here items equivalent to numbers 
    }
  },
  {
    "$group": {
      "_id": {
        Id: {
          $arrayElemAt: ["$converter","$Id"]
        },
        Type: {
          $arrayElemAt: ["$converter","$Type"]
        },
        platform: {
          $arrayElemAt: ["$converter","$platform"]
        }
      },
      "count": {
        $sum: 1
      }
    }
  },
  {
    "$group": {
      "_id": {
        Id: "$_id.Id",
        Type: "$_id.Type"
      },
      "data": {
        $push: {
          k: "$_id.platform",
          v: "$count"
        }
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.Id",
      "data": {
        $push: {
          k: "$_id.Type",
          v: {$arrayToObject: "$data"}
        }
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "data": {
        $push: {
          k: "$_id",
          v: {$arrayToObject: "$data"}
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {$arrayToObject: "$data"}
    }
  }
])

MongoPlayground

...