Si no puede utilizar un campo único como clave de fragmentación, o si necesita garantizar la unicidad en varios campos, cree otra colección que actúe como colección proxy.
Acerca de esta tarea
Un clúster fragmentado impone una restricción de unicidad entre fragmentos solo cuando el índice único se encuentra en la clave del fragmento o incluye la clave del fragmento como prefijo. Una colección proxy sortea esta restricción: la colección proxy contiene tanto una referencia al documento original como la clave única, y la aplicación escribe primero en la colección proxy.
Cuando utilice una colección proxy, tenga en cuenta lo siguiente:
Su aplicación debe detectar errores al insertar documentos en la colección proxy y debe garantizar la coherencia entre ambas colecciones.
Si la colección proxy requiere particionado, se debe particionar en el único campo en el que se desea aplicar la unicidad.
Cada campo requiere su propia colección proxy. Para garantizar la unicidad en más de un campo mediante colecciones proxy fragmentadas, debe tener una colección proxy para cada campo. Si crea varios índices únicos en una sola colección proxy, no podrá fragmentarla.
Este enfoque requiere crear un ID único para el campo
primary_iden lugar de dejar que MongoDB lo cree automáticamente al insertar el documento.
Para consultar el conjunto completo de restricciones que se aplican a los índices únicos en colecciones fragmentadas, consulte la sección "Mantener la unicidad en clústeres fragmentados".
Antes de comenzar
Identifique el campo que requiere una restricción única pero que no puede formar parte de la clave de fragmentación.
Confirme que ningún documento existente infringe la restricción de unicidad para el campo.
Conectar
mongosha una instancia demongos.
Pasos
Consideremos una colección records que almacena información de usuario. El campo email no es la clave de fragmentación, pero debe ser único. La colección proxy contiene los siguientes campos:
{ "_id" : ObjectId("..."), "parent_id" : "<ID>", "email" : "<string>" }
Escribe en la colección proxy antes que en la colección principal.
Inserta un documento que contenga el campo de destino y un ID único generado en la colección proxy. Si la operación es exitosa, inserta el documento completo en la colección records.
records = db.getCollection('records'); proxy = db.getCollection('proxy'); var primary_id = ObjectId(); proxy.insertOne({ "_id" : primary_id, "email" : "example@example.net" }) // if: the above operation returns successfully, // then continue: records.insertOne({ "_id" : primary_id, "email": "example@example.net", // additional information... })