更新复杂类型而不包装

时间:2015-05-07 04:25:18

标签: c# mongodb mongodb-.net-driver

在编写新文档或更新现有文档时,mongodb-c-sharp-driver输出非原始类型的通用bson / json

"myList" : [
    {"value" : "..."},
    {"value" : "..."}
]

但是,当使用Update.Set()语句时,驱动程序使用类型信息

包装实际数据
"myList" : {
    "_t" : "System.Collections.Generic.List`1[[Models.MyModel, Common]]",
    "_v" : [
        {"value" : "..."},
        {"value" : "..."}
    ]
}

我想避免这种包装,因为分布式环境中的其他驱动程序/语言可能会使用相同的数据集。

实现这一目标的唯一方法是获取整个文档,更新并回写吗?

相关旧问题hereherehere

更新

此代码触发类型包装器

public void Set(ObjectId id, string name, object value)
{
    var query = Query.EQ("_id", id);
    var update = Update.Set(name, value.ToBsonDocument());
    _collection.Update(query, update);
}

这是我提出的一种通用方法。它可以设置原始类型以及没有类型信息的复杂类型:

public void Set<T>(ObjectId id, string name, T value)
{
    var query = Query.EQ("_id", id);
    var update = Update.Set(name, ConvertToBsonValue<T>(value));
    _collection.Update(query, update);
}

public BsonValue ConvertToBsonValue<T>(T value)
{
    try
    {
        return BsonValue.Create(value);
    }
    catch
    {
        return value.ToBsonDocument<T>();
    }
}

1 个答案:

答案 0 :(得分:0)

使用Generics而不是对象时,不需要转换为BsonValue。