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

Upserting i Mongo DB og Id-problemet

Jeg har stødt på lignende problem.Jeg ønskede at ophæve dokumenter ved hjælp af den officielle C#-driver. Jeg havde en klasse som denne:

public class MyClass
{
    public ObjectId Id { get; set; }
    public int Field1 { get; set; }
    public string Field2 { get; set; }
}

I konsollen ville jeg skrive:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) og det ville virke. I C# skrev jeg:

collection.Update(Query.EQ("Field1", 3),
                Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
                UpdateFlags.Upsert);

og det virkede ikke! Fordi driveren inkluderer et tomt id i opdateringserklæringen, og når jeg ophæver andet dokument med en anden værdi af Field1 undtagelse E11000 duplicate key error index kastes (i dette tilfælde forsøger Mongo at indsætte et dokument med _id, der allerede findes i db).

Da jeg genererede _id af mig selv (som emnestarter), er jeg stødt på den samme undtagelse (mongo cannot change _id of a document ) om at ophæve objekter med eksisterende værdi af felt1.

Løsning er at markere Id-egenskab ved attribut [BsonIgnoreIfDefault] (og ikke initialisere det). I dette tilfælde udelader driveren _id-feltet i opdateringssætningen, og MongoDb genererer id, hvis det er nødvendigt.



  1. Hvordan kan jeg kontrollere, om et felt findes eller ej i MongoDB?

  2. Play-Framework 2.4.x brugt med MongoDB og Java 8

  3. MongoDB .NET genererer ikke _id ved upsert

  4. MongoDB:Sådan laver du en tekstsøgning og sorterer efter en dato