Restrições únicas em campos arbitrários
Nesta página
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 outracoleção para atuar como uma "coleção proxy". Essa collection deve conter uma referência ao documento original (ou seja, seu ObjectId
) e à chave exclusiva.
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.
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.