MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB agrupa todas as chaves e valores em uma coleção por um determinado campo


Você está no caminho certo aí.

Ao converter o objeto inteiro em um array, salve também o campo Categoria.

As etapas necessárias:
  • $project para salvar a categoria e converter o objeto em um array
  • $unwind a matriz para considerar cada campo separadamente
  • $match para remover _id , Category e quaisquer outros campos que você não deseja agrupar da matriz
  • $group por Category e k para inserir os valores de cada chave em uma matriz
  • $group por Category para coletar as chaves e arrays juntos
  • $project para converter a matriz com valores coletados em um objeto
  • $addFields para injetar a categoria no novo objeto
  • $replaceRoot para promover o novo objeto
db.collection.aggregate([
  {$project: {
      Category: 1,
      fields: {$objectToArray: "$$ROOT"}
  }},
  {$unwind: "$fields"},
  {$match: {"fields.k": {$not: {$in: ["_id","Category"]}} }},
  {$group: {
      _id: {
        Category: "$Category",
        key: "$fields.k"
      },
      value: {$push: "$fields.v"}
  }},
  {$group: {
      _id: "$_id.Category",
      fields: {
        $push: {
          "k": "$_id.key",
          "v": "$value"
        }
      }
  }},
  {$project: {
      fields: {$arrayToObject: "$fields"}
  }},
  {$addFields: {
      "fields.Category": "$_id"
  }},
  {$replaceRoot: { newRoot: "$fields"}}
])

Playground