Разбира се, това, което правите тук, всъщност е проверка на отговора, който показва дали даден документ е бил актуализиран или вмъкнат или всъщност дали нито една от двете операции не е извършена. Това е най-добрият ви показател за $addToSet
ако е извършена актуализация, документът ще бъде актуализиран.
$addToSet
самият оператор не може да произвежда дубликати, това е природата на оператора. Но наистина може да имате проблеми с логиката си:
{
"$addToSet", new BsonDocument()
{
{ "items", new BsonDocument()
{
{ "id", item.Id },
{ "v", item.Value }
}
}
}
}
Толкова ясно показвате, че елемент във вашия „набор“ е съставен от две полета, така че ако това съдържание варира по някакъв начин (т.е. същият идентификатор, но различна стойност), тогава елементът всъщност е „уникален“ член на набора и ще бъде добавен. Няма да има начин например за $addToSet
оператор, за да не добавя нови стойности само въз основа на „id“ като уникален идентификатор. Всъщност ще трябва да включите това в код.
Втората възможност тук за форма на дубликат е, че вашата част от заявката не намира правилно документа, който трябва да бъде актуализиран. Резултатът от това ще бъде създаването на нов документ, който съдържа само новопосочения член в "набора". Така че често срещана грешка при използване е нещо като това:
db.collection.update(
{
"id": ABC,
"items": { "$elemMatch": {
"id": 123, "v": 10
}},
{
"$addToSet": {
"items": {
"id": 123, "v": 10
}
}
},
{ "upsert": true }
)
Резултатът от този вид операция винаги ще създаде нов документ, тъй като съществуващият документ не съдържа посочения елемент в "набора". Правилното внедряване е дане проверете за присъствието на члена "set" и разрешете $addToSet
да свърши работата.
Ако наистина имате вярно дублиращи се записи, появяващи се в „набора“, където всички елементи на поддокумента са абсолютно еднакви, тогава това е причинено от някакъв друг код, който е настоящ или в миналото.
Когато сте сигурни, че се създават нови записи, прегледайте кода за случаи на $push
или наистина и манипулиране на масив в код, който изглежда действа върху същото поле.
Но ако използвате оператора правилно, тогава $addToSet
прави точно това, което е предназначено.