sql >> Databáze >  >> NoSQL >> MongoDB

Jak zjistit, zda $addToSet skutečně přidal novou položku do dokumentu MongoDB nebo zda položka již existovala?

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.




  1. Mongodb se nemůže připojit k localhost, ale může se připojit k IP adrese localhost

  2. Node.js, MongoDB - Vložení/aktualizace více dokumentů a odeslání jediné odpovědi

  3. Bitva o databáze NoSQL - Porovnání funkcí NoSQL MongoDB a MSSQL

  4. Vložený dokument vs reference v designovém modelu mongoose?