Spotkałem się z podobnym problemem. Chciałem upsertować dokumenty za pomocą oficjalnego sterownika C#. Miałem takie zajęcia:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
W konsoli napisałbym:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
i to zadziała. W C# napisałem:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
i to nie zadziałało! Ponieważ sterownik zawiera pusty identyfikator w instrukcji aktualizacji i kiedy wstawiam drugi dokument z inną wartością wyjątku Field1 E11000 duplicate key error index
zostanie wyrzucony (w tym przypadku Mongo próbuje wstawić dokument z _id, który już istnieje w db).
Kiedy sam wygenerowałem _id (jak starter tematu) napotkałem ten sam wyjątek (mongo cannot change _id of a document
) przy wstawianiu obiektów z istniejącą wartością pola 1.
Rozwiązanie jest oznaczenie właściwości Id przez atrybut [BsonIgnoreIfDefault]
(i nie inicjować). W tym przypadku sterownik pomija pole _id w instrukcji aktualizacji, a MongoDb generuje identyfikator, jeśli jest to konieczne.