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.

MongoDB: Eliminando objetos duplicados dentro de un arreglo manteniendo su orden original.

Tengo dos colecciones con los siguientes documentos.

Colección #1

{
  "_id": "1",
  "posts": [
    {"text": "all day long I dream about", "datetime": "123"},
    {"text": "all day long ", "datetime": "321"}
  ]
}

Colección #2

{
  "_id": "1",
  "posts": [
    {"text": "all day long I dream about", "datetime": "123"},
    {"text": "all day long ", "datetime": "8888"},
    {"text": "Después de ver esta película me dio mucha hambre...", "datetime": "8885"}
  ]
}

Estoy fusionando la colección #1 en la colección #2

db.collection_1.aggregate([
  {
    "$merge": {
      "into": "collection_2",
      "on": "_id",
      "whenMatched": [
        {
          "$addFields": {
            "posts": {
              "$concatArrays": ["$posts", "$$new.posts"]
            }
          }
        }
      ],
      "whenNotMatched": "insert"
    }
  }
])

Con esta fusión, el campo “posts” contiene los 5 posts, incluyendo duplicados (el post con “text”: “all day long I dream about”).

En este punto, quiero eliminar los duplicados para “posts”. Estoy haciendo esto usando la siguiente función.

db.collection_2.aggregate([
  {
    "$project": {
      "posts": {
        "$setUnion": ["$posts", "$posts"]
      }
    }
  },
  {
    "$out": "collection_2"
  }
])

Esta función funciona perfectamente, todos los posts duplicados desaparecen. Mi problema es que al usar $setUnion estoy perdiendo el orden original de los posts.

Quiero hacer todo directamente en el servidor de MongoDB.

¿Alguna sugerencia sobre cómo puedo eliminar los posts duplicados y preservar el orden original de ellos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar las publicaciones duplicadas y al mismo tiempo preservar el orden original, se puede utilizar el operador $addToSet en la etapa $group de una tubería (aggregation pipeline). Esto agregará las publicaciones únicas a un conjunto (set), el cual preservará el orden de las publicaciones originales. Aquí tienes un ejemplo de una tubería (pipeline):

    db.collection_2.aggregate([
      { $unwind: "$posts" }, // Desanidar el arreglo de publicaciones
      {
        $group: {
          _id: "$_id",
          posts: { $addToSet: "$posts" } // Agregar las publicaciones únicas al conjunto
        }
      },
      { $sort: { "_id": 1 } }, // Ordenar por _id para preservar el orden original
      { $out: "collection_2" } // Guardar en collection_2
    ])
    

    Esta tubería primero utiliza la etapa $unwind para desanidar el arreglo posts. Luego, en la etapa $group, agrupa los documentos por _id y utiliza $addToSet para agregar las publicaciones únicas a un conjunto. Finalmente, ordena los documentos por _id para preservar el orden original de las publicaciones y utiliza $out para guardar el resultado en collection_2.

    Esta tubería debería eliminar las publicaciones duplicadas mientras se preserva el orden original.

Comments are closed.