c# - 如何通过使用 MongoDB C# 驱动程序调用 obj.ToBsonDocument() 来全局忽略空值?

标签 c# mongodb bson

史前史:我有一个从 XML 模式 (XSD) 生成的类层次结构(很大)。

MyObj obj;

现在:我需要解析一个字符串值,它实际上是一个使用生成的类层次结构的对象的 XML,然后我需要将该对象放入 MongoDB。代码是:

private BsonDocument XmlToBson(string content)
{
    MyObj obj;
    using (var reader = new StringReader(content))
    {
        var serializer = new XmlSerializer(typeof(MyObj));
        obj = (MyObj) serializer.Deserialize(reader);
    }

    return obj.ToBsonDocument();
}

问题:我在层次结构中有很多空子对象,在 Robomongo 中看起来像这样:

Object which is null is added

我想避免将空对象添加到数据库中。我知道我可以一一忽略它们,就像这里所描述的 Ignoring Default Values通过使用属性或 lambda 表达式。但由于层次结构庞大而复杂,我不喜欢这种方法。我懒得列出当它们具有空值时必须忽略的所有属性。更重要的是,该类将来可以重新生成,支持必须忽略的属性列表将是一场噩梦。

问题:无论对象在层次结构中的哪个位置,我如何才能实现目标并全局忽略空值?我正在使用 MongoDB C# 驱动程序版本。 2.2.

最佳答案

您可以通过注册约定包在序列化时将大多数属性的效果应用于所有属性。

IgnoreIfNullConvention 下方注册,在序列化和反序列化时将 [IgnoreIfNull] 属性隐式应用到所有属性。

var anon = new
{
    Foo = "bar",
    Baz = (string)null,
};

ConventionRegistry.Register("Ignore", 
                            new ConventionPack 
                            { 
                                new IgnoreIfNullConvention(true) 
                            }, 
                            t => true);

var bsonDocument = anon.ToBsonDocument();

这将产生一个仅包含 Foo 键的文档。

如果需要,您还可以在序列化后按名称Remove()此约定。

关于c# - 如何通过使用 MongoDB C# 驱动程序调用 obj.ToBsonDocument() 来全局忽略空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38747654/

相关文章:

c# - 为什么用 double 除以零不抛出异常?

python - 在 mongodb 中查询大列表的最快方法

java - 如何使用 Mongo Java 客户端将 BSON Int64 编码为 JSON 字符串

c# - 访问检索到的数据

java - 使用 Bouncy CaSTLe 库 c# 解密 pdf.p7m 文件时出现问题

c# - Windows Phone 8.1 listview 点击更改页面

python - 如何使用 Python/flask 将 Twitter 元数据从服务器流式传输到客户端浏览器

linux - 为什么不建议将 THP(透明大页面)用于 Oracle 和 MongoDB 等数据库?

mongodb - 如何使用 mongo-go-driver 编码/解码具有多态结构的 bson 数组

json - 如何查询 MongoDB 集合上的日期范围,其中 ISO 日期存储在字符串字段中?