Ignoring Extra Elements in mongoDB C# Driver
MongoDB删除字段后会报错: Element ... does not match any field or property of class Customer.
需要在实体类增加 [BsonIgnoreExtraElements] //using MongoDB.Bson.Serialization.Attributes;
参考这篇老外的文章:
mongoDB affords you the ability to store documents within a single collection that can each have their own schema. This is a drastic change if you have a background in relational databases. In a relational database, you have a static schema per table and you cannot deviate from without changing the structure of the table.
In the example below, I have defined a Person
class and a PersonWithBirthDate
class which derives from the Person
class. These can both be stored in the same collection in a mongoDB database. In this case, assume the documents are stored in the Persons
collection.
public class Person { public string FirstName { get; set; } public string LastName { get; set; } } public class PersonWithBirthDate : Person { public DateTime DateOfBirth { get; set; } }
You can easily retrieve and of the documents and have the mongoDB C# Driver deserialze the document into the PersonWithBirthDate
class. However, you will run into issues if you query the Persons
collection and try to have the driver deserialize the data into the Person
class. You will receive an error that there are elements that cannot be deserialized.
This easily fixable by adding the [BsonIgnoreExtraElements]
attribute to the Person
class. You can see the modified class below. This will instruct the driver to ignore any elements that it cannot deserialize into a corresponding property. With the attribute any document in the Persons
collection can be deserailized to thePerson
class without error.
[BsonIgnoreExtraElements] public class Person { public string FirstName { get; set; } public string LastName { get; set; } } public class PersonWithBirthDate : Person { public DateTime DateOfBirth { get; set; } }
There is a gotcha that I recently found while trying to implement a scenario similar to the one above. In the source code for the mongo C# driver, the attribute is defined in a way that it can be inherited to the child classes when applied to the parent class (BsonIgnoreExtraElementsAttribute.cs). However, when the attribute is read, it ignores the inheritance of the attribute (BsonClassMap.cs) and does not get applied to the child classes. I agree with this implementation, but it’s a little confusing if you review the source code for the definition of the[BsonIgnoreExtraElements]
attribute. Even with this inconsistency, all you need to do is to apply the[BsonIgnoreExtraElements]
to each class that may read a document from a collection where there are extra elements.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述