更新复杂类型而不换行
Update complex types without wrapping
编写新文档或更新现有文档时,mongodb-c-sharp-driver 输出非原始类型的通用bson/json
"myList" : [
{"value" : "..."},
{"value" : "..."}
]
然而,当使用 Update.Set()
语句时,驱动程序将实际数据包装为 info
类型
"myList" : {
"_t" : "System.Collections.Generic.List`1[[Models.MyModel, Common]]",
"_v" : [
{"value" : "..."},
{"value" : "..."}
]
}
我想避免这种包装,因为分布式环境中的其他 drivers/languages 可能会使用相同的数据集。
获取整个文档、更新并回写是唯一的方法吗?
相关老问题here, here and here.
更新
此代码触发类型包装器
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>();
}
}
当使用泛型而不是对象时,不需要转换为 BsonValue。
编写新文档或更新现有文档时,mongodb-c-sharp-driver 输出非原始类型的通用bson/json
"myList" : [
{"value" : "..."},
{"value" : "..."}
]
然而,当使用 Update.Set()
语句时,驱动程序将实际数据包装为 info
"myList" : {
"_t" : "System.Collections.Generic.List`1[[Models.MyModel, Common]]",
"_v" : [
{"value" : "..."},
{"value" : "..."}
]
}
我想避免这种包装,因为分布式环境中的其他 drivers/languages 可能会使用相同的数据集。
获取整个文档、更新并回写是唯一的方法吗?
相关老问题here, here and here.
更新
此代码触发类型包装器
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>();
}
}
当使用泛型而不是对象时,不需要转换为 BsonValue。