在编写新文档或更新现有文档时,mongodb-c-sharp-driver输出非原始类型的通用bson / json
"myList" : [
{"value" : "..."},
{"value" : "..."}
]
但是,当使用Update.Set()
语句时,驱动程序使用类型信息
"myList" : {
"_t" : "System.Collections.Generic.List`1[[Models.MyModel, Common]]",
"_v" : [
{"value" : "..."},
{"value" : "..."}
]
}
我想避免这种包装,因为分布式环境中的其他驱动程序/语言可能会使用相同的数据集。
实现这一目标的唯一方法是获取整个文档,更新并回写吗?
更新
此代码触发类型包装器
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>();
}
}
答案 0 :(得分:0)
使用Generics而不是对象时,不需要转换为BsonValue。