Se não for possível usar um campo exclusivo como chave de fragmento ou se for necessário impor a exclusividade em vários campos, você deverá criar outra coleção para atuar como uma "coleção proxy". Esta coleção deve conter uma referência ao documento original (ou seja, seu ObjectId) e a chave única.
Considere uma coleção records que armazena informações de usuário. O campo email não é a chave de fragmento, mas precisa ser único.
A coleção proxy então conteria o seguinte:
{ "_id" : ObjectId("...") "parent_id" : "<ID>" "email" : "<string>" }
Utilize o seguinte comando para criar um índice único no campo email:
db.proxy.createIndex( { "email" : 1 }, { unique : true } )
O exemplo a seguir primeiro tenta inserir um documento contendo o campo de destino e um ID único gerado na coleção proxy. Se a operação for bem-sucedida, ela inserirá o documento completo na coleção 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... })
Observe que essa metodologia requer a criação de um ID exclusivo para o campo primary_id em vez de permitir que o MongoDB o crie automaticamente na inserção do documento.
Se você precisar impor exclusividade em vários campos, cada campo exigiria sua própria coleção de proxy.
Dica
A documentação completa de: createIndex() e shardCollection.
Considerações
Seu aplicativo deve detectar erros ao inserir documentos na coleção "proxy" e deve impor consistência entre as duas coleções.
Se a coleção de proxy exigir fragmentação, você deverá fragmentar o único campo no qual deseja impor a exclusividade.
Para impor a exclusividade em mais de um field usando coleção de proxy fragmentadas, você deve ter uma coleção de proxy para cada campo para o qual deseja impor a exclusividade. Se você criar vários índice único em uma única proxy coleção, não poderá fragmentar as coleções de proxy.