更新复杂类型而不换行

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。