I have a problem while upserting to mongo db using the official C# driver.
public abstract class AggregateRoot
{
///
/// All mongoDb docu
I've encountered similar problem. I wanted to upsert documents using official C# driver. I had a class like this:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
In console I would write: db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
and it would work. In C# I wrote:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
and it didn't work! Because driver includes empty id in update statement and when I upsert second document with different value of Field1 exception E11000 duplicate key error index
is thrown (in this case Mongo tries to insert a document with _id that already exists in db).
When I generated _id by myself (like topic starter) I've encountered the same exception (mongo cannot change _id of a document
) on upserting objects with existing value of Field1.
Solution is to mark Id property by attribute [BsonIgnoreIfDefault]
(and not initialize it). In this case driver omits _id field in update statement and MongoDb generates Id if it necessary.
Looks like you might be explicitly setting the Id
value for both inserts and updates. That's fine for inserts, all new objects need an _id
value, however for updates you're not allowed to change the value of _id
on an existing document after it's created.
Try not setting the Id
value at all. If you don't specify a value before inserting, the driver uses built-in IdGenerator
classes to generate a new _id value, so if it's an ObjectId type it'll use the ObjectIdGenerator
. Then both your inserts and updates work fine.