sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan bestemmer man, om $addToSet faktisk tilføjede et nyt element i et MongoDB-dokument, eller om elementet allerede eksisterede?

Det, du gør her, er selvfølgelig at tjekke svaret, som angiver, om et dokument blev opdateret eller indsat, eller faktisk, om ingen af ​​handlingerne skete. Det er din bedste indikator for en $addToSet for at have udført en opdatering ville dokumentet derefter blive opdateret.

$addToSet operatøren kan ikke selv producere dubletter, det er operatørens natur. Men du kan faktisk have nogle problemer med din logik:

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

Så tydeligt viser du, at et element i dit "sæt" er sammensat af to felter, så hvis indholdet varierer på nogen måde (dvs. samme id, men forskellig værdi), så er elementet faktisk et "unikt" medlem af sættet og vil blive tilføjet. Der ville for eksempel ikke være nogen måde for $addToSet operatør for ikke at tilføje nye værdier udelukkende baseret på "id" som en unik identifikator. Du skulle faktisk rulle det i kode.

En anden mulighed her for en form for duplikat er, at din forespørgselsdel ikke finder det dokument, der skal opdateres korrekt. Resultatet af dette ville være at oprette et nyt dokument, der kun indeholder det nyligt specificerede medlem i "sættet". Så en almindelig brugsfejl er noget som dette:

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

Resultatet af den slags operation ville altid oprette et nyt dokument, fordi det eksisterende dokument ikke indeholdt det angivne element i "sættet". Den korrekte implementering er at ikke tjek tilstedeværelsen af ​​"sæt"-medlemmet og tillad $addToSet at gøre arbejdet.

Hvis du faktisk har sand duplikerede indtastninger, der forekommer i "sættet", hvor alle elementer i underdokumentet er nøjagtigt ens, så er det forårsaget af en anden kode enten til stede eller tidligere.

Hvor du er sikker på, at der oprettes en ny post, kan du se koden igennem for forekomster af $push eller faktisk og array-manipulation i kode, der ser ud til at virke på det samme felt.

Men hvis du bruger operatoren korrekt, så $addToSet gør præcis, hvad den er beregnet til.




  1. Hvor farlig er en mongo-forespørgsel, som føres direkte fra en URL-forespørgselsstreng?

  2. Sådan bruger du $in-operator i mongodb med to felter i java

  3. MongoDB:Fjernelse af et felt fra ALLE underdokumenter i et matrixfelt

  4. Hvordan bruger man db-referencer med reaktive Spring Data MongoDB?