次のメソッドを使用して、MongoDB C#ドライバーを介してすべての部分的な更新を処理するジェネリックメソッドを構築しようとしています。
public bool UpdateObject<T>(UpdatableObject<T> updatableObject)
where T : new()
{
var builder = GenerateMongoUpdateBuilder(updatableObject.ModifiedFields);
var collection = GetCollection<T>();
var result = collection.Update(Query.EQ("_id", BsonValue.Create(updatableObject.Id)), builder, new MongoUpdateOptions { Flags = UpdateFlags.Multi });
return result.UpdatedExisting;
}
private static UpdateBuilder GenerateMongoUpdateBuilder(Dictionary<string, object> modifiedFields)
{
var builder = new UpdateBuilder();
foreach (var modifiedField in modifiedFields)
{
var type = modifiedField.Value.GetType();
if (type.IsPrimitive || type.IsValueType || (type == typeof(string)))
{
builder.Set(modifiedField.Key, BsonValue.Create(modifiedField.Value));
}
else
{
builder.Set(modifiedField.Key, modifiedField.Value.ToBsonDocument());
}
}
return builder;
}
BsonValueを介してプリミティブ型を処理し、BsonDocumentを介して非プリミティブ型を処理するソリューションを見つけるまで、しばらく苦労しなければなりませんでした。辞書を保持するオブジェクトを作成するまで、すべてがうまく機能しました。挿入は完全に機能しますが、(このメソッドを使用して)更新されると、それ以上逆シリアル化することはできません。更新の前後のMongoのオブジェクトを見ると、それはもう同じオブジェクトではないことがわかります。更新後、追加の_tフィールドに「System.Collections.Generic.Dictionary`2 [System.String、[SomeObject、SomeObjectAssembly]」が含まれます。 ]」
だから私は私の実装に疑問を呈し始めています...
私が間違っていることは何ですか?
ありがとう、ニール。