es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo agrupar, distinguir y agregar campos en MongoDB

Tengo una colección de documentos como los siguientes:

{
  '_id': ,
  'group': 'group1',
  'name': 'car; pet; bike'
},
{
  '_id': ,
  'group': 'group1',
  'name': 'car; pet; plant'
},
{
  '_id': ,
  'group': 'group2',
  'name': 'music; toy; cat'
},
{
  '_id': ,
  'group': 'group2',
  'name': 'dog'
},
{
  '_id': ,
  'group': 'group3',
  'name': 'star; planet'
}

Necesito usar .aggregate() para obtener lo siguiente:

{
  '_id': ,
  'group': 'group1',
  'name': 'car; pet; bike; plant'
},
{
  '_id': ,
  'group': 'group2',
  'name': 'music; toy; cat; dog'
},
{
  '_id': ,
  'group': 'group3',
  'name': 'star; planet'
}

Por lo tanto, el resultado es un grupo del campo group y concatenar el campo name haciendo una distinción en los valores.

No pude entender cómo hacerlo.

¿Cómo se puede hacer?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, podemos usar la etapa $group de MongoDB en combinación con los operadores $addToSet y $concat dentro del método .aggregate().

    Se puede utilizar el siguiente código:

    db.collection.aggregate([
      {
        $group: {
          _id: "$group",
          name: {
            $addToSet: "$name"
          }
        }
      },
      {
        $project: {
          _id: 0,
          group: "$_id",
          name: {
            $reduce: {
              input: "$name",
              initialValue: "",
              in: {
                $cond: [
                  {
                    $eq: [
                      "$$value",
                      ""
                    ]
                  },
                  "$$this",
                  {
                    $concat: [
                      "$$value",
                      "; ",
                      "$$this"
                    ]
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    Explicación:
    – La etapa $group agrupa los documentos basados en el campo group y agrega todos los valores distintos de name a un array utilizando $addToSet.
    – La etapa $project se utiliza para reformar el resultado. El operador $reduce se utiliza para concatenar los valores de name dentro del array para cada grupo. El operador $cond se utiliza para manejar el caso donde el array está vacío. El resultado se asigna al campo name. El campo _id se excluye y el campo group se asigna con el valor de _id.

    Esto debería producir el resultado deseado.

Comments are closed.