MongoDB中的部分更新C#驱动程序 - 字典问题

时间:2012-08-23 09:11:13

标签: c# mongodb dictionary partial

我正在尝试使用以下方法构建一个通用方法来处理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] ]“

所以我开始质疑我的实施......

知道我做错了什么吗?

谢谢, 尼尔。

1 个答案:

答案 0 :(得分:0)

在Robert Stam的礼貌下,问题得到了解决。这些都在Jira项目中描述。 谢谢!