sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur avgör man om $addToSet faktiskt har lagt till ett nytt objekt i ett MongoDB-dokument eller om objektet redan existerade?

Naturligtvis vad du gör här är att kontrollera svaret som visar om ett dokument har uppdaterats eller infogats eller faktiskt om ingen av operationerna hände. Det är din bästa indikator för en $addToSet för att ha utfört en uppdatering skulle dokumentet då uppdateras.

$addToSet operatören själv kan inte producera dubbletter, det är operatörens natur. Men du kan verkligen ha några problem med din logik:

{                                                
      "$addToSet", new BsonDocument()
           {
                { "items", new BsonDocument()
                     {
                          { "id", item.Id },
                          { "v", item.Value } 
                     }
                }
           }
 }

Så tydligt visar du att ett objekt i din "uppsättning" består av två fält, så om innehållet varierar på något sätt (dvs samma id men olika värde) så är föremålet faktiskt en "unik" medlem av uppsättningen och kommer att läggas till. Det skulle till exempel inte finnas något sätt för $addToSet operatören att inte lägga till nya värden enbart baserat på "id" som en unik identifierare. Du måste faktiskt lägga in det i kod.

En andra möjlighet här för en form av dubblett är att din frågedel inte korrekt hittar dokumentet som måste uppdateras. Resultatet av detta skulle vara att skapa ett nytt dokument som bara innehåller den nyligen angivna medlemmen i "uppsättningen". Så ett vanligt misstag är ungefär så här:

db.collection.update(
    { 
        "id": ABC,
        "items": { "$elemMatch": {
            "id": 123, "v": 10
         }},
    {
        "$addToSet": {
            "items": {
                "id": 123, "v": 10
            }
        }
    },
    { "upsert": true }
)

Resultatet av den typen av operation skulle alltid skapa ett nytt dokument eftersom det befintliga dokumentet inte innehöll det angivna elementet i "uppsättningen". Den korrekta implementeringen är att inte kontrollera närvaron av "set"-medlemmen och tillåt $addToSet att göra jobbet.

Om du verkligen har sant dubbla poster som förekommer i "uppsättningen" där alla element i underdokumentet är exakt likadana, då det har orsakats av någon annan kod antingen närvarande eller tidigare.

Om du är säker på att en ny post skapas, titta igenom koden efter instanser av $push eller faktiskt och arraymanipulation i kod som verkar agera på samma fält.

Men om du använder operatorn korrekt så $addToSet gör precis vad den är avsedd att göra.




  1. Skapa en databas i MongoDB

  2. MongoClient fungerar inte med php

  3. MongoDB - upsert som involverar listor

  4. Ta bort flera dokument från mongo i en enda fråga