MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como definir uma restrição exclusiva para o campo no documento aninhado na matriz?


Sim. Consulte os dois cenários a seguir sobre como usar o índice exclusivo em um campo de matriz com documentos incorporados.

Índice multichave exclusivo (índice no campo do documento embdeed dentro de uma matriz):


Primeiro cenário:
db.arrays.createIndex( { _id: 1, "array.id": 1}, { unique: true } )

db.arrays.insertOne( { "_id": 1, "array": [ { "id": 1, "content": "11"}, { "id": 2, "content": "22"} ] } )

db.arrays.insertOne( { "_id": 2, "array": [ { "id": 1, "content": "1100"}, { "id": 5, "content": "55"} ] } )

db.arrays.insertOne( {"_id": 3, "array": [ {"id": 3, "content": "33"}, {"id": 3, "content": "3300"} ] } )

Todos os três documentos são inseridos sem erros.

De acordo com a nota sobre Índice Multichave Exclusivo , acima, o documento com _id : 3 tem dois documentos incorporados no array com o mesmo "array.id" valor:3 .

Além disso, a exclusividade é aplicada em duas chaves do índice composto { _id: 1, "array.id": 1} e havia "array.id" duplicado valores nos documentos também (o _id valores 1 e 2 ).


Segundo Cenário:
db.arrays2.createIndex( { "array.id": 1 }, { unique: true } )

db.arrays2.insertOne( { "_id": 3, "array": [ { "id": 3, "content": "33" }, { "id": 3, "content": "330"} ] } )
db.arrays2.insertOne( { "_id": 4, "array": [ { "id": 3, "content": "331" }, { "id": 30, "content": "3300" } ] } )

O primeiro documento com _id : 3 é inserido com sucesso. O segundo tem um erro:"errmsg" : "E11000 duplicate key error collection: test.arrays2 index: array.id_1 dup key: { array.id: 3.0 } " . Este comportamento é o esperado de acordo com a nota Índice Multichave Exclusivo .