数组迁移脚本的MongoDB属性



我正在尝试对数据库进行迁移,到目前为止,该数据库具有以下结构:

{
"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游乐场

最新更新