MongoDB Schema Evolution Best Practice



在我的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] 属性可以省略。

最新更新