sql >> Database >  >> NoSQL >> MongoDB

Hoe een unieke beperking in te stellen voor een veld in een in een array genest document?

Ja. Zie de volgende twee scenario's over het gebruik van de unieke index op een matrixveld met ingesloten documenten.

Unieke multikey-index (index op ingesloten documentveld binnen een array):


Eerste scenario:

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

Alle drie de documenten worden zonder fouten ingevoegd.

Volgens de opmerking over Unieke Multikey Index , hierboven, het document met _id : 3 heeft twee ingesloten documenten in de array met dezelfde "array.id" waarde:3 .

De uniciteit wordt ook afgedwongen op twee sleutels van de samengestelde index { _id: 1, "array.id": 1} en er waren dubbele "array.id" waarden in de documenten ook ( de _id waarden 1 en 2 ).


Tweede scenario:

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

Het eerste document met _id : 3 wordt met succes ingevoegd. De tweede heeft een fout:"errmsg" : "E11000 duplicate key error collection: test.arrays2 index: array.id_1 dup key: { array.id: 3.0 } " . Dit gedrag is zoals verwacht volgens de opmerking Unique Multikey Index .



  1. MongoDB:class java.lang.Double kan niet worden gecast naar class java.lang.Long

  2. Hoe geneste documenten recursief te doorkruisen in MongoDB

  3. Mongodb-atlas + node.js werken lokaal, maar stoppen wanneer ze naar Heroku . worden gepusht

  4. Ondersteunt Mongo-connector het toevoegen van velden voordat deze in Elasticsearch worden ingevoegd?