我正在尝试对数据库进行迁移,到目前为止,该数据库具有以下结构:
{
"site" : {
"name" : "siteName1"
},
"subStages" : [
"subStage1",
"subStage2"
]
}
我们处理一个网站的方式发生了一些变化,现在可以有多个网站,而不仅仅是一个。
因此,我需要将数据库更改为如下所示:
{
"sites" : [
{
"name" : "siteName1",
"subStages" : [
"subStage1",
"subStage2"
]
},
{
"name" : "siteName2"
}
]
}
有没有一种方法可以通过简单的迁移脚本更改架构,使每个站点都位于"sites"数组中?
如有任何帮助,我们将不胜感激。
如果需要,我可以分享更多信息。
编辑:
站点是一个对象的结构,嵌套对象内部如下:
Object1: {
stages: [
{
stage1: {
attributes
}
.
.
.
stageINeed: {
add sites ---> sites: [
]
}
}
我如何进入我需要的这个特定阶段?
编辑2:完整结构:
集合"tickets"将有许多ticket条目,其结构需要更改为我们之前讨论的内容。具体结构如下:
{
"_id" : ObjectId("62bf0b8b4feee27711d65e0f"),
"files" : [],
"stages" : [
{
"name" : "Documents",
"updatedAt" : ISODate("2022-07-01T14:58:19.108Z"),
"state" : "none"
},
.
.
.
{
"name" : "Registry",
"state" : "none",
"subStages" : [
{
"name" : "name1",
"completed" : false
},
{
"name" : "name2",
"completed" : false
},
{
"name" : "name3",
"completed" : false
}
],
"updatedAt" : ISODate("2022-07-01T14:58:19.108Z"),
}
]
}
我想绘制的结构如下:
{
"_id" : ObjectId("62e9219dfacb4b96823af822"),
"files" : [],
"stages" : [
{
"name" : "Documents",
"updatedAt" : ISODate("2022-07-01T14:58:19.108Z"),
"state" : "none"
},
.
.
.
{
"name" : "Registry",
"state" : "none",
"sites" : [
{
"name" : "site1",
"completed" : false,
"status" : "none",
"subStages" : [
{
"name" : "name1",
"completed" : false
},
{
"name" : "name2",
"completed" : false
},
{
"name" : "name3",
"completed" : false
}
]
}
],
"updatedAt" : ISODate("2022-08-02T13:07:41.688Z"),
}
],
}
这是因为未来的票证将有两个站点,所以我想将现有站点的结构更改为站点配置。现在,在票证中,我没有任何写着"站点"的内容,我从另一个名为configuration的数据库中获取所有内容。
到目前为止,我有以下内容,但我不知道它是否正确:
const configSite= config.find(stage => stage.type === "Registry")?.site;
const tickets = await this.tickets.updateMany(
{ "stages.type": "Registry" },
[
{
$replaceRoot: {
newRoot: {
name: "$stages.name",
state: "$stages.state",
updatedAt: "$stages.updatedAt",
type: "$stages.type",
sites: [
{
name: configSite.name,
subStages: configSite.subStages
},
],
},
},
},
],
{
multi: false,
upsert: false,
}
);
return tickets;
是的,您可以使用流水线更新和$replaceRoot在一次更新中完成此操作,如下所示:
db.collection.updateMany({},
[
{
$replaceRoot: {
newRoot: {
_id: "$_id",
sites: [
{
name: "$site.name",
substages: "$subStages"
}
]
}
}
}
])
Mongo游乐场
编辑
以下是如何对您提供的完整结构进行操作,我不得不做出一些假设,因为有些事情并不完全清楚。例如;阶段";其具有";子阶段";字段将被转换,其他字段将不按您的样本进行转换。
db.collection.updateMany({},
[
{
$set: {
stages: {
$map: {
input: {
$ifNull: [
"$stages",
[]
]
},
in: {
$cond: [
"$$this.subStages",
{
name: "$$this.name",
state: "$$this.state",
sites: [
{
//where should this come from,
status: "$$this.state",
completed: {
$allElementsTrue: "$$this.subStages.completed"
},
//where should this come from,
name: "site1",
subStages: "$$this.subStages"
}
]
},
"$$this"
]
}
}
}
}
}
])
Mongo游乐场