sql >> Database >  >> NoSQL >> MongoDB

Hoe te bepalen of $addToSet daadwerkelijk een nieuw item heeft toegevoegd aan een MongoDB-document of dat het item al bestond?

Wat u hier doet, is natuurlijk het antwoord controleren dat aangeeft of een document is bijgewerkt of ingevoegd, of dat geen van beide bewerkingen heeft plaatsgevonden. Dat is uw beste indicator voor een $addToSet om een ​​update te hebben uitgevoerd, zou het document dan worden bijgewerkt.

De $addToSet operator kan zelf geen duplicaten produceren, dat is de aard van de operator. Maar je kunt inderdaad wat problemen hebben met je logica:

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

Je laat dus duidelijk zien dat een item in je "set" is samengesteld uit twee velden, dus als die inhoud op enigerlei wijze varieert (d.w.z. dezelfde id maar een andere waarde), dan is het item eigenlijk een "uniek" lid van de set en zal worden toegevoegd. Er zou bijvoorbeeld geen manier zijn voor de $addToSet operator om geen nieuwe waarden toe te voegen die puur gebaseerd zijn op de "id" als unieke identificatie. Je zou dat eigenlijk in code moeten rollen.

Een tweede mogelijkheid hier voor een vorm van duplicaat is dat uw zoekgedeelte het document dat moet worden bijgewerkt niet correct vindt. Het resultaat hiervan zou een nieuw document zijn dat alleen het nieuw opgegeven lid in de "set" bevat. Een veelvoorkomende gebruiksfout is dus zoiets als dit:

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

Het resultaat van dat soort bewerking zou altijd een nieuw document creëren omdat het bestaande document het gespecificeerde element in de "set" niet bevatte. De juiste implementatie is om niet controleer op de aanwezigheid van het "set" lid en sta $addToSet . toe om het werk te doen.

Als je inderdaad true . hebt dubbele vermeldingen die voorkomen in de "set" waar alle elementen van het subdocument precies hetzelfde zijn, dan is het veroorzaakt door een andere code, aanwezig of in het verleden.

Als je zeker weet dat er nieuwe items worden gemaakt, kijk dan in de code voor instanties van $push of inderdaad en arraymanipulatie in code die op hetzelfde veld lijkt te werken.

Maar als je de operator correct gebruikt, dan $addToSet doet precies waarvoor het bedoeld is.




  1. Hoe subdocumenten van een object in een array te retourneren met Meteor en MongoDB

  2. Geaggregeerde zoekopdracht in mongo werkt, niet in Pymongo

  3. Hoe kan ik programmatisch de huidige database krijgen waarnaar Mongoid schrijft?

  4. Gemiddeld een subdocumentveld over documenten in Mongo