我正在尝试在旧版本和较新版本的模型之间编写迁移脚本,我们有一个反应式迁移系统,它检查加载的模型版本以查看它是否是最新版本。如果不是,它将向模型应用迁移增量并将其保留为新形式。在这个新版本中,所有改变的是现在其中一个子对象有一个叫做“SomeNewKey”的密钥。
以下是数据如何查找旧版本的模型:
{
SomeModel:
{
_id: <some-guid>,
Version: 1.0.1
Name: <some-string>,
SomeArrayData: [
{
Name: <some-string>,
DateCreated: <some-date>
},
{
Name: <some-string>,
DateCreated: <some-date>
},
{
Name: <some-string>,
DateCreated: <some-date>
}
]
}
}
以下是新版本的应用方式:
{
SomeModel:
{
_id: <some-guid>,
Versio: 1.0.2
Name: <some-string>,
SomeArrayData: [
{
Name: <some-string>,
DateCreated: <some-date>,
SomeNewKey: <some-default-guid>
},
{
Name: <some-string>,
DateCreated: <some-date>,
SomeNewKey: <some-default-guid>
},
{
Name: <some-string>,
DateCreated: <some-date>,
SomeNewKey: <some-default-guid>
}
]
}
}
因为你可以看到我基本上需要获取模型,然后浏览SomeArrayData
中的每个子文档并插入一个带有默认空guid的新密钥。
我首先尝试过:
var findQuery = Query.EQ("_id", id);
var updateQuery = Update.Set("SomeArrayData.SomeNewKey", Guid.Empty);
var result = collection.Update(findQuery, updateQuery, UpdateFlags.Multi);
if (result.Ok == false) { throw new Exception(result.ErrorMessage); }
然而,这一直引起了人们对写作问题的关注,我无法找到很多相关信息,所以后来我看了一遍,发现了以下文章:
Updating an array of objects with a new key in mongoDB
这似乎意味着我需要进行聚合调用才能完成数组的展开,但我找不到任何关于如何在C#驱动程序中执行此类操作的示例,所以任何人都可以指出我正确的方向?