Срещнах подобен проблем. Исках да вмъкна документи с помощта на официалния C# драйвер. Имах клас като този:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
В конзолата бих написал:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
и щеше да работи. В C# написах:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
и не се получи! Тъй като драйверът включва празен идентификатор в израза за актуализация и когато вкарам втори документ с различна стойност на изключение на Field1 E11000 duplicate key error index
се хвърля (в този случай Mongo се опитва да вмъкне документ с _id, който вече съществува в db).
Когато генерирах _id сам (като начало на тема), срещнах същото изключение (mongo cannot change _id of a document
) при поставяне на обекти със съществуваща стойност на Field1.
Решение е да маркира свойството Id чрез атрибут [BsonIgnoreIfDefault]
(и да не го инициализира). В този случай драйверът пропуска полето _id в оператора за актуализиране и MongoDb генерира идентификатор, ако е необходимо.