sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur ställer man in unik begränsning för fält i dokument kapslat i array?

Ja. Se följande två scenarier om att använda det unika indexet på ett matrisfält med inbäddade dokument.

Unikt multikeyindex (index på inbäddat dokumentfält i en array):


Första scenariot:

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

Alla tre dokumenten infogas utan några fel.

Enligt anteckningen om Unique Multikey Index , ovan, dokumentet med _id : 3 har två inbäddade dokument i arrayen med samma "array.id" värde:3 .

Dessutom framtvingas unikheten på två nycklar i det sammansatta indexet { _id: 1, "array.id": 1} och det fanns dubbletter av "array.id" värden över dokumenten också ( _id värden 1 och 2 ).


Andra scenariot:

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

Det första dokumentet med _id : 3 sätts in. Den andra har ett fel:"errmsg" : "E11000 duplicate key error collection: test.arrays2 index: array.id_1 dup key: { array.id: 3.0 } " . Detta beteende är som förväntat enligt noten Unikt Multikey Index .



  1. MongoError:inte auktoriserad för att utföra kommandot { find:app_updates, filter:{ key:0.0.1-admins }, limit:1, batchSize:1, singleBatch:true }

  2. Mongoose findOneAndUpdate:uppdatera ett objekt i en array av objekt

  3. MongoDB-Escape prickar '.' i kartnyckel]

  4. När ska man stänga av Transparent Huge Pages för redis