Samozřejmě to, co zde děláte, je ve skutečnosti kontrola odpovědi, která naznačuje, zda byl dokument aktualizován nebo vložen, nebo ve skutečnosti nedošlo k žádné operaci. To je váš nejlepší indikátor pro $addToSet
pro provedení aktualizace by se dokument aktualizoval.
$addToSet
samotný operátor nemůže vytvářet duplikáty, to je povaha operátora. Ale můžete mít skutečně nějaké problémy se svou logikou:
{
"$addToSet", new BsonDocument()
{
{ "items", new BsonDocument()
{
{ "id", item.Id },
{ "v", item.Value }
}
}
}
}
Takže jasně ukazujete, že položka ve vaší „sadě“ se skládá ze dvou polí, takže pokud se obsah jakýmkoli způsobem liší (tj. stejné id, ale odlišná hodnota), pak je položka ve skutečnosti „jedinečným“ členem sady a bude být přidán. Neexistuje žádný způsob například pro $addToSet
operátor nepřidávat nové hodnoty čistě na základě "id" jako jedinečného identifikátoru. Ve skutečnosti byste to museli převést do kódu.
Druhou možností pro formu duplikátu je, že vaše část dotazu správně nenachází dokument, který má být aktualizován. Výsledkem by bylo vytvoření nového dokumentu, který by obsahoval pouze nově zadaný člen v "sadě". Běžná chyba při používání je tedy něco takového:
db.collection.update(
{
"id": ABC,
"items": { "$elemMatch": {
"id": 123, "v": 10
}},
{
"$addToSet": {
"items": {
"id": 123, "v": 10
}
}
},
{ "upsert": true }
)
Výsledek takové operace by vždy vytvořil nový dokument, protože existující dokument neobsahoval zadaný prvek v "set". Správná implementace je ne zkontrolujte přítomnost člena "set" a povolte $addToSet
dělat práci.
Pokud skutečně máte pravdu duplicitní položky vyskytující se v "setu", kde jsou všechny prvky dílčího dokumentu naprosto stejné, pak to bylo způsobeno nějakým jiným kódem, ať už přítomným nebo v minulosti.
Pokud jste si jisti, že se vytvářejí nové položky, prohlédněte si v kódu výskyty $push
nebo skutečně a manipulace s polem v kódu, který vypadá, že působí na stejném poli.
Ale pokud používáte operátor správně, pak $addToSet
dělá přesně to, co má dělat.