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.