Eu encontrei um problema semelhante. Eu queria upsert de documentos usando o driver C# oficial. Tive uma aula assim:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
No console eu escreveria:
db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
e funcionaria. Em C# eu escrevi:collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
e não funcionou! Porque o driver inclui id vazio na instrução de atualização e quando eu upsert segundo documento com valor diferente da exceção Field1
E11000 duplicate key error index
é lançado (neste caso o Mongo tenta inserir um documento com _id que já existe no db). Quando gerei _id por mim mesmo (como iniciador de tópicos), encontrei a mesma exceção (
mongo cannot change _id of a document
) em objetos de upsert com valor existente de Field1. Solução é marcar a propriedade Id pelo atributo
[BsonIgnoreIfDefault]
(e não inicializá-lo). Nesse caso, o driver omite o campo _id na instrução de atualização e o MongoDb gera Id, se necessário.