Saltar al contenido

¿Cómo eliminar duplicados basados ​​en una clave en Mongodb?

Solución:

Esta respuesta es obsoleta: los dropDups La opción se eliminó en MongoDB 3.0, por lo que se requerirá un enfoque diferente en la mayoría de los casos. Por ejemplo, puede usar la agregación como se sugiere en: Documentos duplicados de MongoDB incluso después de agregar una clave única.

Si está seguro de que source_references.key identifica registros duplicados, puede garantizar un índice único con el dropDups:true opción de creación de índice en MongoDB 2.6 o anterior:

db.things.ensureIndex({'source_references.key' : 1}, {unique : true, dropDups : true})

Esto mantendrá el primer documento único para cada source_references.key valor y descarte cualquier documento posterior que de otro modo causaría una violación de clave duplicada.

Nota IMPORTANTE: Cualquier documento al que le falte source_references.key Se considerará que el campo tiene un nulo valor, por lo que se eliminarán los documentos posteriores a los que les falte el campo clave. Puede agregar el sparse:true Opción de creación de índice para que el índice solo se aplique a documentos con una source_references.key campo.

Precaución obvia: Realice una copia de seguridad de su base de datos e intente esto en un entorno de prueba primero si le preocupa la pérdida de datos no intencionada.

Esta es la consulta más fácil que utilicé en mi MongoDB 3.2

db.myCollection.find({}, {myCustomKey:1}).sort({_id:1}).forEach(function(doc){
    db.myCollection.remove({_id:{$gt:doc._id}, myCustomKey:doc.myCustomKey});
})

Indexe su customKey antes de ejecutar esto para aumentar la velocidad

Si bien @ Stennie’s es una respuesta válida, no es la única forma. De hecho, el manual de MongoDB le pide que tenga mucho cuidado al hacer eso. Hay otras dos opciones

  1. Deje que MongoDB lo haga por usted usando Map Reduce
    • De otra manera
  2. Haces programáticamente lo que es menos eficiente.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *