mongodb - MongoDB Schema Evolution 最佳实践
问题描述
在我的 MongoDB 应用程序(用 C# 编写)中,我有一个文档,我希望以后对其进行扩展,这意味着稍后将在数据库已经投入生产使用时添加字段。
只要我的应用程序的新版本不会声明额外的数据字段是强制性的,扩展实际上就不是问题。所以我将定义一个默认值,而不是现有数据就可以了。
但是有几个应用程序访问这个数据库,其中一个可能没有更新,因此不知道添加的数据字段。
默认情况下,在这种情况下应用程序会遇到异常(读取未知数据字段)。对于这种情况,指定了一个类属性 [BsonIgnoreExtraElements],这会导致忽略这个未知字段。
但是,如果这个旧应用程序将写回一个未完全读取的文档,则由新应用程序添加到数据库文档中的字段将丢失。
我知道避免这种情况的唯一解决方案是使用无类型数据(BsonDocument 甚至只有 JSON 字符串)。
还有其他解决方案吗?对此有最佳做法吗?
非常感谢您的所有回答和评论!
解决方案
嘿,我找到了解决方案,这非常简单!
添加 BsonDocument 类型的字段并使用属性 [BsonExtraElements] 对其进行标记。这会导致额外的字段存储在该字段中。原则上,它们可以以通用方式访问,但这不是本意。它只会让这个(旧)版本的客户端不知道所有额外的数据,并将其写回原样。
// This field will be set with all data which is not known by this class (makes this class upwards-compatible)
[BsonExtraElements]
public BsonDocument ExtraElements { get; set; }
(然后可以省略 [BsonIgnoreExtraElements] 属性。)
推荐阅读
- postgresql - Google Data Studio + Postgresql 中的动态日期
- javascript - 将对象作为道具传递给 jsx。没有 {...obj}
- inno-setup - 使用 Inno Setup 6.0.3 创建的安装程序不会使用默认 UAC 设置自动重启 Windows 2019
- mysql - laravel 上的外键
- java - 无法使用 Spock 模拟 Java 方法调用
- javascript - 需要在 ngx-pagination 的中间页面前后显示 2 页
- python - PyMySQL 内部错误:数据包顺序错误
- azure - Bot 在模拟器中完美运行,但在 webchat 中的测试中部署时失败发送失败重试错误
- python - 从 Jenkins 运行 Python 脚本时出现语法错误
- javascript - Second Promise 是否会等待 First Promise 完成才开始