同様の問題が発生しました。公式の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);
そしてそれはうまくいきませんでした!ドライバーの更新ステートメントに空のIDが含まれているため、およびField1例外E11000 duplicate key error index
の値が異なる2番目のドキュメントをアップサートすると がスローされます(この場合、Mongoはdbにすでに存在する_idを持つドキュメントを挿入しようとします)。
(トピックスターターのように)自分で_idを生成したときに、同じ例外が発生しました(mongo cannot change _id of a document
)Field1の既存の値を持つオブジェクトのアップサーティングについて。
解決策 属性[BsonIgnoreIfDefault]
によってIdプロパティをマークすることです (初期化しないでください)。この場合、ドライバーはupdateステートメントの_idフィールドを省略し、MongoDbは必要に応じてIdを生成します。