Кажется, вам нужен индекс мультиключа с уникальным ограничением .Учтите, что в каждой коллекции может быть только один индекс для нескольких ключей, поэтому вам нужно включить все поля, которые вы хотите уникальности, в массив
{
_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})