Si no puedes usar un campo único como clave de partición o si necesitas garantizar la exclusividad sobre varios campos, debes crear otro
colección para que actúe como una "colección proxy". Esta colección debe contener tanto una referencia al documento original (es decir, su
ObjectId) y la clave única.
Considere una colección records que almacena información del usuario. El campo email no es la clave del fragmento, pero debe ser único.
La colección proxy entonces contendría lo siguiente:
{ "_id" : ObjectId("...") "parent_id" : "<ID>" "email" : "<string>" }
Utiliza el siguiente comando para crear un índice único en el campo email:
db.proxy.createIndex( { "email" : 1 }, { unique : true } )
En el siguiente ejemplo, primero se intenta insertar un documento que contiene el campo de destino y un ID único generado en la colección proxy. Si la operación es exitosa, entonces se inserta el documento completo en la colección records.
records = db.getSiblingDB('records'); proxy = db.getSiblingDB('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... })
Ten en cuenta que esta metodología requiere crear un ID único para el campo primary_id en lugar de dejar que MongoDB lo cree automáticamente al insertar el documento.
Si necesita imponer unicidad en múltiples campos, entonces cada campo requerirá su propia colección de proxy.
Considerations
Tu aplicación debe capturar errores al insertar documentos en la colección 'proxy' y debe aplicar la coherencia entre las dos colecciones.
Si la colección proxy requiere particionado, se debe particionar en el único campo en el que se desea aplicar la unicidad.
Para aplicar la unicidad en más de un campo mediante el uso de colecciones de proxies particionado, debes tener una colección de proxies para cada campo para el que se quiera aplicar la unicidad. Si creas múltiples índices únicos en una sola colección proxy, no podrás fragmentar colecciones proxy.