Jag har stött på liknande problem.Jag ville rubba dokument med den officiella C#-drivrutinen. Jag hade en klass så här:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
I konsolen skulle jag skriva:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
och det skulle fungera. I C# skrev jag:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
och det gick inte! Eftersom drivrutinen inkluderar ett tomt ID i uppdateringssatsen och när jag upphäver det andra dokumentet med ett annat värde på Field1 undantag E11000 duplicate key error index
kastas (i detta fall försöker Mongo infoga ett dokument med _id som redan finns i db).
När jag skapade _id av mig själv (som topic starter) har jag stött på samma undantag (mongo cannot change _id of a document
) om att flytta objekt med befintligt värde för Fält1.
Lösning är att markera Id-egenskap med attributet [BsonIgnoreIfDefault]
(och inte initiera det). I det här fallet utelämnar drivrutinen _id-fältet i uppdateringssatsen och MongoDb genererar ID om det behövs.