Saya mengalami masalah serupa. Saya ingin memasukkan dokumen menggunakan driver C# resmi. Saya memiliki kelas seperti ini:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
Di konsol saya akan menulis:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
dan itu akan berhasil. Dalam C# saya menulis:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
dan itu tidak berhasil! Karena driver menyertakan id kosong dalam pernyataan pembaruan dan ketika saya memasukkan dokumen kedua dengan nilai pengecualian Field1 yang berbeda E11000 duplicate key error index
dilempar (dalam hal ini Mongo mencoba memasukkan dokumen dengan _id yang sudah ada di db).
Ketika saya membuat _id sendiri (seperti topik starter) saya menemukan pengecualian yang sama (mongo cannot change _id of a document
) untuk menambahkan objek dengan nilai Field1 yang ada.
Solusi adalah untuk menandai properti Id dengan atribut [BsonIgnoreIfDefault]
(dan tidak menginisialisasi itu). Dalam hal ini driver menghilangkan bidang _id dalam pernyataan pembaruan dan MongoDb menghasilkan Id jika perlu.