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.

Copiar valores de una colección de Mongodb a otra evitando el error 11000: ‘No único’.

Esto es lo que tengo actualmente:

db.collectionFrom.aggregate([
    { $project: { _id: "$field5", field1: 1, field4: 1} },
    { $out : "collectionTo" }
]);

Intento copiar solo ciertos campos de collectionFrom a collectionTo (field1, field4, field5), uno de los cuales (field5) se utilizará como clave en la nueva colección.

El problema es que para field5, el mismo valor puede existir más de una vez en collectionFrom, lo que da como resultado el error 11000: ‘No único’.

La etapa $out no puede manejar esos casos para field5 (referencia: https://docs.mongodb.com/manual/reference/operator/aggregation/out/#index-constraints).

¿Hay alguna forma de ignorar (o eliminar) los posibles duplicados? ¿Quizás agregando otra etapa en la agregación en la canalización? No quiero borrar ningún documento en collectionFrom.

[Actualización] Nota: Esto debería ejecutarse en una instancia de DocumentDB en AWS (v3.6.0)

Gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar duplicados en el campo 5 de DocumentDB, puedes incluir una etapa adicional de $group en el pipeline después de la etapa de $project.

    Aquí tienes un ejemplo:

    db.collectionFrom.aggregate([
      {
        $project: {
          _id: "$field5",
          field1: 1,
          field4: 1
        }
      },
      {
        $group: {
          _id: "$_id",
          field1: { $first: "$field1" },
          field4: { $first: "$field4" }
        }
      },
      { $out: "collectionTo" }
    ])
    

    La etapa de $group agrupa los documentos por el campo _id (que es el valor único de field5) y utiliza el operador $first para devolver el primer valor no nulo de field1 y field4.

    Esto eliminará efectivamente cualquier duplicado en el campo field5, mientras copia los campos necesarios a collectionTo.

Comments are closed.