Tôi đã gặp sự cố tương tự. Tôi muốn nâng cấp tài liệu bằng trình điều khiển C # chính thức. Tôi đã có một lớp học như thế này:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
Trong bảng điều khiển, tôi sẽ viết:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
và nó sẽ hoạt động. Trong C # tôi đã viết:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
và nó đã không hoạt động! Bởi vì trình điều khiển bao gồm id trống trong câu lệnh cập nhật và khi tôi nâng cấp tài liệu thứ hai với giá trị khác của ngoại lệ Field1 E11000 duplicate key error index
bị ném (trong trường hợp này Mongo cố gắng chèn một tài liệu có _id đã tồn tại trong db).
Khi tôi tự tạo _id (chẳng hạn như người bắt đầu chủ đề), tôi đã gặp phải ngoại lệ tương tự (mongo cannot change _id of a document
) trên việc nâng cấp các đối tượng có giá trị hiện có của Field1.
Giải pháp là đánh dấu thuộc tính Id theo thuộc tính [BsonIgnoreIfDefault]
(và không khởi tạo nó). Trong trường hợp này, trình điều khiển bỏ qua trường _id trong câu lệnh cập nhật và MongoDb tạo Id nếu cần.