sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo establecer una restricción única para el campo en un documento anidado en una matriz?

Sí. Consulte los siguientes dos escenarios sobre el uso del índice único en un campo de matriz con documentos incrustados.

Índice multiclave único (índice en el campo del documento incrustado dentro de una matriz):


Primer escenario:

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"} ] } )

Los tres documentos se insertan sin ningún error.

Según la nota sobre Índice único de claves múltiples , arriba, el documento con _id : 3 tiene dos documentos incrustados dentro de la matriz con el mismo "array.id" valor:3 .

Además, la unicidad se impone en dos claves del índice compuesto { _id: 1, "array.id": 1} y había "array.id" duplicados valores en los documentos también (el _id valores 1 y 2 ).


Segundo escenario:

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" } ] } )

El primer documento con _id : 3 se inserta con éxito. El segundo tiene un error:"errmsg" : "E11000 duplicate key error collection: test.arrays2 index: array.id_1 dup key: { array.id: 3.0 } " . Este comportamiento es el esperado según la nota Índice multiclave único .