首页 > 解决方案 > MongoDB Schema Evolution 最佳实践

问题描述

在我的 MongoDB 应用程序(用 C# 编写)中,我有一个文档,我希望以后对其进行扩展,这意味着稍后将在数据库已经投入生产使用时添加字段。

只要我的应用程序的新版本不会声明额外的数据字段是强制性的,扩展实际上就不是问题。所以我将定义一个默认值,而不是现有数据就可以了。

但是有几个应用程序访问这个数据库,其中一个可能没有更新,因此不知道添加的数据字段。

默认情况下,在这种情况下应用程序会遇到异常(读取未知数据字段)。对于这种情况,指定了一个类属性 [BsonIgnoreExtraElements],这会导致忽略这个未知字段。

但是,如果这个旧应用程序将写回一个未完全读取的文档,则由新应用程序添加到数据库文档中的字段将丢失。

我知道避免这种情况的唯一解决方案是使用无类型数据(BsonDocument 甚至只有 JSON 字符串)。

还有其他解决方案吗?对此有最佳做法吗?

非常感谢您的所有回答和评论!

标签: mongodb

解决方案


嘿,我找到了解决方案,这非常简单!

添加 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] 属性。)


推荐阅读