正在将Mongo-DB集合字段从对象更新为对象数组



我不得不将mongoDB中集合的一个字段从一个对象更改为包含大量数据的对象数组。新文档可以毫无问题地插入,但当试图获取旧数据时,它永远不会正确映射到原始DTO,并遇到错误。

主题是学生集合中更改的字段。

我想知道有没有办法更新所有记录,使它们都有相同的数据类型,而不会丢失任何数据。

旧版本的学生:

{
"_id": "5fb2ae251373a76ae58945df",
"isActive": true,
"details": {
"picture": "http://placehold.it/32x32",
"age": 17,
"eyeColor": "green",
"name": "Vasquez Sparks",
"gender": "male",
"email": "vasquezsparks@orbalix.com",
"phone": "+1 (962) 512-3196",
"address": "619 Emerald Street, Nutrioso, Georgia, 6576"
},
"subject": 
{
"id": 0,
"name": "math",
"module": {
"name": "Advanced",
"semester": "second"
}
}
}

这需要更新到这样的新版本:

{
"_id": "5fb2ae251373a76ae58945df",
"isActive": true,
"details": {
"picture": "http://placehold.it/32x32",
"age": 17,
"eyeColor": "green",
"name": "Vasquez Sparks",
"gender": "male",
"email": "vasquezsparks@orbalix.com",
"phone": "+1 (962) 512-3196",
"address": "619 Emerald Street, Nutrioso, Georgia, 6576"
},
"subject": [
{
"id": 0,
"name": "math",
"module": {
"name": "Advanced",
"semester": "second"
}
},
{
"id": 1,
"name": "history",
"module": {
"name": "Basic",
"semester": "first"
}
},
{
"id": 2,
"name": "English",
"module": {
"name": "Basic",
"semester": "second"
}
}
]
}

我知道可能有一种方法可以重命名旧集合,创建新集合,并将基于旧集合的数据插入到新集合中。我在想直接的办法。

目标是将subject变成一个1的数组,如果它还不是一个数组,那么就不使用它。这将发挥作用:

update args are (predicate, actions, options).
db.foo.update(
// Match only those docs where subject is an object (i.e. not turned into array):
{$expr: {$eq:[{$type:"$subject"},"object"]}},   
// Actions: set subject to be an array containing $subject.  You MUST use the pipeline version
// of the update actions to correctly substitute $subject in the expression!
[  {$set: {subject: ["$subject"] }} ],
// Do this for ALL matches, not just first:                  
{multi:true});

您可以反复运行此转换器,因为它将忽略转换后的文档。

如果目标是转换并添加一些新主题,保留第一个主题,那么我们可以设置额外的主题并将它们连接到一个数组中,如下所示:

var mmm = [ {id:8, name:"CORN"}, {id:9, name:"DOG"} ];
rc = db.foo.update({$expr: {$eq:[{$type:"$subject"},"object"]}},
[ {$set: {subject: {$concatArrays: [["$subject"], mmm]} }} ],
{multi:true});

最新更新