sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB agrupa todas las claves y valores en una colección por un campo determinado

Estás en el camino correcto allí.

Al convertir todo el objeto en una matriz, guarde también el campo Categoría.

Las etapas necesarias:

  • $proyecto para guardar la categoría y convertir el objeto en una matriz
  • $desenrollar la matriz para considerar cada campo por separado
  • $match para eliminar _id , Category y cualquier otro campo que no desee agrupar de la matriz
  • $grupo por Category y k para insertar los valores de cada clave en una matriz
  • $grupo por Category para recopilar las claves y las matrices juntas
  • $proyecto para convertir la matriz con valores recopilados en un objeto
  • $addFields para inyectar la categoría en el nuevo objeto
  • $replaceRoot para promocionar el nuevo 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"}}
])

Patio de juegos