接上篇

忽略某字段或属性

手动构造类映射时您可以简单地通过不将字段或属性添加到类映射。当使用自动映射你需要指定应忽略该字段或属性的方法。可以使用属性编写如下编写:

public class MyClass {

    [BsonIgnore]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.UnmapProperty(c => c.SomeProperty);

});

在这种情况下的自动映射将有最初属性自动添加到类映射但UnmapProperty会将其删除。

忽略空值

默认为空的值序列化到 BSON 文档时对应的 BSON字段 Null。替代方法是序列化时忽略掉具有null值的字段或属性。要指定此使用如下属性编写:

public class MyClass {

    [BsonIgnoreIfNull]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不是属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.SomeProperty).SetIgnoreIfNull(true);

});

设置默认值

您可以指定一个字段或属性的默认值,如下所示:

public class MyClass {

    [BsonDefaultValue("abc")]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不使用属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.SomeProperty).SetDefaultValue("abc");

});

您还可以控制是否将默认值序列化(默认值为是)。不序列化属性默认值做法:

public class MyClass {

    [BsonDefaultValue("abc")]

    [BsonIgnoreIfDefault]

    public string SomeProperty { get; set; }

}

或使用初始化代码而不使用属性:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.SomeProperty)

        .SetDefaultValue("abc")

        .SetIgnoreIfDefault(true);

});

忽略基于ShouldSerializeXyz方法的成员

有时决定是否序列化一个成员比仅仅决定控制或者默认值是否序列化要复杂的多。您可以编写用于确定是否应序列化的方法。通常的方法成员Xyz被命名为ShouldSerializeXyz。如果您按照此命名约定然后自动映射将自动检测到方法和使用它。例如:

public class Employee {

    public ObjectId Id { get; set; }

    [BsonDateTimeOptions(DateOnly = true)]

    public DateTime DateOfBirth { get; set; }

    public bool ShouldSerializeDateOfBirth() {

        return DateOfBirth > new DateTime(, , );

    }

}

或使用初始化代码而不是命名约定:

BsonClassMap.RegisterClassMap<Employee>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.DateOfBirth).SetShouldSerializeMethod(

        obj => ((Employee) obj).DateOfBirth > new DateTime(, , )

    );

});

确定必须字段

通常情况下,反序列化程序不关心将要被反序列化的文档是否不包含匹配的元素。不具有匹配元素的成员只是简单的获得分配给它们的默认值。

如果你想要使文档中的元素必须需要,您可以像这样标记单个字段或属性:

public class MyClass {

    public ObjectId Id { get; set; }

    [BsonRequired]

    public string X { get; set; }

}

改为使用初始化代码的方法:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.X).SetIsRequired(true);

});

警告:

在反序列化时将会抛出一个异常,这种状态并不适用于序列化.

指定序列化程序

有时需要的序列化程序,而不是使用Bson库。可以通过下面几种方法来达到此目的:

public class MyClass {

    public ObjectId Id { get; set; }

    [BsonSerializer(typeof(MyCustomStringSerializer))]

    public string X { get; set; }

}

改为使用初始化代码的方式:

BsonClassMap.RegisterClassMap<MyClass>(cm => {

    cm.AutoMap();

    cm.GetMemberMap(c => c.X).SetSerializer(new MyCustomStringSerializer());

});

待续。。。。。

MongoDB学习(翻译7)的更多相关文章

  1. MongoDB学习3

    MongoDB学习(翻译3)   支持的where字句(比较多,今天先写一部分) 本节介绍支持的where字句 正如前面提到的,不是所有的C#表达式都支持where子句.您可以以此文为指导,或者你可以 ...

  2. MongoDB学习2

    MongoDB学习(翻译2) C#驱动之LINQ教程 介绍 本教程涵盖了1.8发布版本对linq查询的支持. 开始本教程之前,你应该至少阅读下C#驱动教程关于C#驱动的介绍 快速开始 首先,添加下面命 ...

  3. MongoDB学习笔记二- Mongoose

    MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...

  4. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  5. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  6. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  7. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  8. PHP操作MongoDB学习笔记

    <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************** ...

  9. MongoDB学习:(二)MongoDB简单使用

    MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...

  10. MongoDB学习:(一)MongoDB安装

    MongoDB学习:(一)MongoDB安装 MongoDB介绍:     直接百科了: MongoDB安装: 1:下载安装: MongoDB安装:https://www.mongodb.com/do ...

随机推荐

  1. BZOJ 3689 异或 Trie木+堆

    标题效果:特定n的数量,这种需求n数22 XOR的值前者k少 首先,我们建立了一个二进制的所有数字Trie木,您可以使用Trie木size域检查出一些其他的数字XOR值首先k少 然后,我们要保持一个堆 ...

  2. 浅谈 js 数字格式类型

    原文:浅谈 js 数字格式类型 很多人也许只知道 ,123.456,0xff 之类的数字格式.其实 js 格式还有很多数字格式类型,比如 1., .1 这样的,也有 .1e2 这样的. 可能有人说这是 ...

  3. Ubuntu 12.04 64bit 安装编译GCC 4.1.2 绝对原创

    1. 下载并解压源代码: wget http://mirrors.ustc.edu.cn/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2 tar jxvf gcc-4.1.2. ...

  4. 【百度地图API】——如何让标注自动呈现在最佳视野内

    原文:[百度地图API]--如何让标注自动呈现在最佳视野内 摘要: “我有一堆标注,不规则的散落在地图的各个地方,我想把它们展示在一个最佳视野中,怎么办呢?”一位API爱好者咨询道. -------- ...

  5. GCD &amp;&amp; Run Loops学习笔记

    1.GCD 使用不同优先级的若干个队列乍听起来非常直接,只是,我们强烈建议,在绝大多数情况下使用默认的优先级队列就能够了.假设运行的任务须要訪问一些共享的资源,那么在不同优先级的队列中调度这些任务非常 ...

  6. SSH深度历险记(两) Jboss+EJB一审

    学习感悟:每次学习新知识.通过初审会从小事做起,获得成就感.经典Hello Workd我们成功的例子奠定了门哈,呢.非常好的理解了.Ejb的核心. 今天主要以这个小实例,来学习EJB的分布式,我们能够 ...

  7. Android KeyStore Stack Buffer Overflow (CVE-2014-3100)

    /* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: minzhenfei@163.com */ 1. KeyStore Service 在Android中,/system/bi ...

  8. oracle存储过程+游标处理select数据

    create or replace PROCEDURE UPDATE_RECORDCODE is cursor location_data is select * from location wher ...

  9. JDK-windows7环境变量配置-亲测版本 以及HelloWorld

    1.下载并安装jdk,假设安装1.6.0_45版本到C:\Program Files\Java,则安装完毕后,目录结构为: C:\PROGRAM FILES\JAVA├─jdk1.6.0_45│ ├─ ...

  10. CentOS上安装WordPress搭建博客平台

    前两天在服务器上搭建了AMP,今天试着在上面安装了一个WordPress(中文:http://cn.wordpress.org/,英文:http://wordpress.org/),我安装的是英文最新 ...