接上篇

忽略某字段或属性

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

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. KMP算法之从next[]到nextVal[]

    前些日子写了一篇KMP算法的博文,浅谈数据结构之KMP(串中的模式匹配算法),在这片文章中,谈到了一个模式串K值的记录数组 next[],详细可看那篇文章,其实,前面定义的next[]数组是有一定缺陷 ...

  2. 浅谈javascript中的call()和apply()方法

    话说在js中,每个函数都包含两个非继承而来的放方法,apply()和call(),使得我们能在特定的作用域中调用函数. 官方定义: 语法:       fun.call(thisArg[, arg1[ ...

  3. Java Web整合开发(12) -- JDBC

    JDBC访问数据库的一般步骤: 注册驱动,获取连接,获取Statement,执行SQL并返回结果集,遍历结果集显示数据,释放连接. Connection conn = null; Statement ...

  4. iOS开展 - 中国 iOS/Mac 开发博客列表

    博客地址 RSS地址 OneV's Den http://onevcat.com/atom.xml 破船之家 http://beyondvincent.com/atom.xml NSHipster h ...

  5. 登录记住账号和密码小Demo

    读取 // 1.读取沙盒中plist文件 // 1.1.获得沙盒根路径 NSString *home = NSHomeDirectory(); // 1.2.拼接Documents路径 NSStrin ...

  6. java23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. 基于tomcat为了应对高并发模型实现webserver

    在博客上,一个简单的AIOweb来样加工.查看AIO异步处理,依靠操作系统完成IO操作Proactor处理模型确实很强大,它可以实现高并发.高响应server一个很好的选择,但在tomcat中间con ...

  8. Cocos2d-x3.0之路--02(引擎文件夹分析和一些细节)

    关于怎么搭建好开发环境的我就不写了,网上非常多. 那么 我们来看看 引擎文件的文件夹 所谓知己知彼 百战不殆嘛 先说一下setup.py 这个文件是有关配置的python文件,比方我们在进行andro ...

  9. PDF解决方案(2)--文件转PDF

    相关专题链接: PDF解决方案(1)--文件上传 PDF解决方案(2)--文件转PDF PDF解决方案(3)--PDF转SWF PDF解决方案(4)--在线浏览 前言:上一篇中讲到的文件上传,文件上传 ...

  10. 如何去除configure的默认选择-g O2

    http://lists.gnu.org/archive/html/autoconf/2006-04/msg00002.html http://www.linuxidc.com/Linux/2013- ...