MongoDB индекс для значения уникальности - PullRequest
0 голосов
/ 25 января 2019

Мне нужен индекс, который обеспечит мне уникальность поля среди всех полей.Например, у меня есть документ:

{
   _id: ObjectId("123"),
   fieldA: "a",
   fieldB: "b"
}

, и я хочу запретить вставку документа

{
   _id: ObjectId("456"),
   fieldA: "new value for field a",
   fieldB: "a"
}

, поскольку уже существует документ, значение которого "a" установлено в поле "поля А».Является ли это возможным?

1 Ответ

0 голосов
/ 25 января 2019

Кажется, вам нужен индекс мультиключа с уникальным ограничением .Учтите, что в каждой коллекции может быть только один индекс для нескольких ключей, поэтому вам нужно включить все поля, которые вы хотите уникальности, в массив

{
   _id: ObjectId("123"),
   multikey: [
              {fieldA: "a"},
              {fieldB: "b"}
             ]
}

Попробуйте этот код

db.collection.createIndex( { "multikey": 1}, { unique: true } )

Для запроса вам нужно набрать код

db.collection.findOne({"multikey.fieldA": "a"},    // Query
   {"multikey.fieldA": 1, "multikey.fieldB": 1})   // Projection

Для получения дополнительной информации вы можете взглянуть на вложенные многопользовательские документы.

Надеюсь, это поможет.

другой вариант - создать документ с каждым уникальным ключом, проиндексированным этим уникальным ключом, и выполнить цикл над полем каждого документа-кандидата, отменяя запись, если какой-либо ключ найден.ИМО, это решение более ресурсоемкое, в обмен на это вы получаете список всех ключей, использованных в письменных документах.

   db.collection.createIndex( { "unikey": 1}, { unique: true } )
   db.collection.insertMany( {[{"unikey": "$FieldA"},{"unikey": "$FieldB"}]} 
   db.collection.find({"unikey": 1})
...