Mongodb 将Mongo DB集合字段从对象更新为对象数组

Mongodb 将Mongo DB集合字段从对象更新为对象数组,mongodb,Mongodb,我不得不在mongoDB中将我的集合中的一个字段从一个对象更改为包含大量数据的对象数组。插入新文档时没有任何问题,但是当尝试获取旧数据时,它永远不会正确映射到原始DTO,并且会出错 主题是在学生集合中更改的字段 我想知道是否有办法更新所有记录,使它们都具有相同的数据类型,而不丢失任何数据 学生的旧版本: { "_id": "5fb2ae251373a76ae58945df", "isActive": true,

我不得不在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"
        }
      }
    ]
  }

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

目标是将
主题
变成一个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});


这里有点不对劲<代码>学生:[“idDetails”:{…}不是有效的对象。你是说
学生:[{“idDetails”:{…}]
?我想你可能想要的形状更像这样:
学生:{idDetails:{…},主题:[{modulefld1:val,modulefl2:val},{mf1:val,mf2:val}]
您可以从第一个主题到最后一个主题对数组进行切片,或者过滤器也可以工作。根据实际结构,这可能很容易。但是我们需要更多数据。我的朋友,您可以发布一份收集中的示例文档吗?很抱歉之前的打字错误,我已经更新了上面的示例文档,注意有许多嵌套子文档(字段)在模块下,跳过这些内容以保持简短。@BuzzMoschetti;@Minsky;@wak786一吨重的Buzz