接上篇

忽略某字段或属性

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

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. PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例

    原文:PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例 <!--小幅的坐标转换点位程序--> <!DOCTYPE html> <html&g ...

  2. jquery 直接调用 wcf,面向服务的SOA架构 ( 第二天)

    在前面的基础上,我们来开始第二天编写 客户端 的东西,不过讲之前,我想告诉大家的是: 这个简单的SOA的架构,我们直接通过wcf 调用到 后台的方法, 而中间没有使用 C#代码,大大减少我们客户端的代 ...

  3. NET 平台下的插件化开发内核

    .NET 平台下的插件化开发内核(Rabbit Kernel)   每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...

  4. JS代码的几个注意点规范

    也谈谈规范JS代码的几个注意点 也谈谈规范JS代码的几个注意点 写JS代码差不多也有两年了吧,从刚开始的“初生牛犊不怕虎”乱写一通到后来也慢慢知道去规范一下自己写的代码.这种感觉就像是代码是你的作品, ...

  5. Java多线程详解

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  6. 【Unity Shaders】Mobile Shader Adjustment —— 为手机定制Shader

    本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图.这里是本书所需的代码和 ...

  7. linux 多个源文件在编译时会产生一个目标文件

    obj-m := target.o target-objs :=  src1.o src2.o src3.o 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  8. Android Material Design带UI变化

    谷歌Matias Duarte称,"Material Design是漂亮和大胆的.由于干净的排版和布局简单且easy理解.内容才是焦点. 谷歌I/O 014开发人员大会上宣布全新的设计语言& ...

  9. 对JSON数组对象排序-有键相同的元素,分组数量不一致,可采用如下的JS进行循环表格输出

    var now=eval(data.data); // now.sort(sortBy('bigIdOrder', true, parseInt)); var tab=""; va ...

  10. 安卓Monkey源码分析之运行流程

    在<MonkeyRunner源码分析之与Android设备通讯方式>中,我们谈及到MonkeyRunner控制目标android设备有多种方法,其中之一就是在目标机器启动一个monkey服 ...