接上篇

忽略某字段或属性

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

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. event.srcElement与event.target的区别

    window.event.srcElement与window.event.target 都是指向触发事件的元素,它是什么就有什么样的属性 srcElement是事件初始化目标html元素对象引用,因为 ...

  2. iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释

    一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...

  3. Hash散列算法 Time33算法

    hash在开发由频繁使用.今天time33也许最流行的哈希算法. 算法: 对字符串的每一个字符,迭代的乘以33 原型: hash(i) = hash(i-1)*33 + str[i] ; 在使用时.存 ...

  4. 堆VS栈

    c#堆VS栈(Part One) 前言 本文主要是讲解C#语言在内存中堆.栈的使用情况,使读者能更好的理解值类型.引用类型以及线程栈.托管堆. 首先感谢原文作者:Matthew Cochran 为我们 ...

  5. C#二维码生成解析

    C#二维码生成解析工具,可添加自定义Logo 二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能 ...

  6. android学习8(ListView高级使用)

    ListView在android更开放的,于是继续ListView说明使用. 首先创建一个android项目,项目名为ListViewTest. ListView的简单使用 改动布局文件,改动后代码例 ...

  7. IOS发展--他们控制的定义

    有没有这样的要求,,自定义panel,里面放几个控件,在多个页面中使用此panel. 有三个观点来解决这个问题: 1.自己继承UIView写一个类,在它是在代码的形式加入需要控制.完成布局. 2.使用 ...

  8. C++ ofstream和ifstream具体的方法和C语言file说明

    ofstream是从内存到硬盘,ifstream是从硬盘到内存,事实上所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,全部的I/O都以这个"流"类为基础的,包含我 ...

  9. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  10. Python 2.7.3 Time与DateTime格式化

    import time import datetime class TimeX: '''时间工具,目前用于格式化时间''' @staticmethod def GetLocalTimeString_T ...