C# 不换行更新复杂类型
在编写新文档或更新现有文档时,mongodb-c-sharp-driver会输出非原语类型的通用bson/jsonC# 不换行更新复杂类型,c#,mongodb,mongodb-.net-driver,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]]", "
"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>();
}
}
公共无效集(ObjectId、字符串名称、T值)
{
var query=query.EQ(“\u id”,id);
var update=update.Set(名称,ConvertToBsonValue(值));
_收集、更新(查询、更新);
}
公共BsonValue CONVERTOBSONVALUE(T值)
{
尝试
{
返回BsonValue.Create(value);
}
抓住
{
返回值.ToBsonDocument();
}
}
当使用泛型而不是对象时,不需要将其转换为BsonValue。如果您能提供代码,也许我们可以帮助您修复它。@CraigWilson请查看更新。我认为这解决了这个问题,因为名义类型和实际类型是相同的,并且是已知的。这是正确的还是可以做得更好?在源代码中,我发现了一些定制转换器的东西,但还没有深入研究。我这样做的原因是在处理不同复杂类型的许多存储库类之间共享基本操作。谢谢由于我仍然没有导致问题的代码,我无法告诉您这是否解决了您的问题。我知道您在这里使用异常作为控制流,这是不好的。如果您想提供导致问题的实际代码,我很乐意看一看。再次更新了哪些不起作用,哪些起作用。异常处理程序允许BsonValue.Create
和BsonTypeMapper.MapToBsonValue
运行兼容性检查。如果有一种更优雅的方式,而不重复您已经编写的相当长的代码,我会很高兴;)例如,Type.IsPrimitive
意味着DateTime
将作为.ToBsonDocument
运行,而不是BsonValue.Create
哦,您正在使用一个对象。是 啊我们对一个物体无能为力。使用类型化API通常意味着您知道类型是什么。因为您使用的是object,所以我们往返该值的唯一可能方法是使用鉴别器。您要么需要接受您的解决方案,要么需要重构。