Я столкнулся с подобной проблемой.Я хотел сохранить документы, используя официальный драйвер 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);
, и это не сработало!Поскольку драйвер включает пустой идентификатор в операторе обновления, и когда я вставляю второй документ с другим значением поля1, возникает исключение E11000 duplicate key error index
(в этом случае Mongo пытается вставить документ с _id, который уже существует в БД).
Когда я сам сгенерировал _id (например, начало темы), я столкнулся с тем же исключением (mongo cannot change _id of a document
) при добавлении объектов с существующим значением Field1.
Решение состоит в том, чтобы пометить свойство Idпо атрибуту [BsonIgnoreIfDefault]
(и не инициализировать его).В этом случае драйвер пропускает поле _id в операторе обновления, а MongoDb генерирует Id, если это необходимо.