如何使用数据库中的现有数据使用 insertMany 创建多个对象?

How do I create a number of objects with insertMany with existing data from the db?

我目前正在尝试通过 insertMany 插入大量模型,但我似乎无法弄清楚如何在创建对象时填充数组。我对 Mongoose 比较陌生,如有任何帮助,我将不胜感激,这是我现在拥有的代码。

const ProgramsSchema = new mongoose.Schema({
   program_id: {
       type: String,
       required: true
   },
   description: {
       type: String
   },
});
const schoolsSchema = new mongoose.Schema({
    inst_url: {
        type: String
    },
    programs: {
        type: [{type: ProgramsSchema, ref: "Programs"}]
    }
});

这是我尝试创建一些学校并将其添加到数据库的代码。

let new_schools = []
for (let i = 0; i < schools.length; i++) {
  let school = schools[i]
  let p_arr = []
  for (let p_index = 0; p_index < school["PROGRAMS"].length; p_index++) {
     let p_id = school["PROGRAMS"][p_index]
      Programs.find({program_id: p_id}).populate('Programs').exec(function(err, data) {
      if (err) {
        console.log(err);
      } else {
        p_arr.push(data[0])
      }
    })
  }
  let newSchool = {
    inst_url: school["INSTURL"],
    programs: p_arr,
  }
  new_schools.push(newSchool);
}

Schools.insertMany(new_schools);

我基本上可以将所有学校数据添加到数据库中,但是 none 的程序正在填充。我想知道是否有办法做到这一点以及最佳做法是什么。如果你们需要更多信息或者我的问题不清楚,请告诉我。

您的猫鼬模式存在一些问题。根据您的猫鼬模式,您尝试在 find 中执行的操作不可用。您不能从“计划”填充到“学校”。您可以从“学校”填充到“项目”,例如:

Schools.find().populate(programs)

为此,需要对您的架构进行一些更改。这个想法是将程序 _id 存储在学校集合中的 programs 数组中,并能够通过 populate()、常规填充或 'custom populate'(填充虚拟)获取程序信息).

常规populate()

我会更改 schoolsSchema 以便将 _id 的数组存储到 programs:

const schoolsSchema = new mongoose.Schema({
    inst_url: {
        type: String
    },
    programs: [
        {type: String, ref: "Programs"}
    ]
});

您也应该更改 ProgramsSchema

const ProgramsSchema = new mongoose.Schema({
   _id: Schema.Types.ObjectId, // that's important
   description: {
       type: String
   },
});

现在,您可以:

Programs.find({_id: p_id}).exec(function(err, data) {
    if (err) {
        console.log(err);
    } else {
        p_arr.push(data[0]._id)
    }
})

您的文档应该已正确插入。现在您可以在对 School 执行查询时填充 programs,正如我在上面指出的那样:

Schools.find().populate(programs)

填充虚拟

另一种方式。首先,我从来没有尝试过这种方式,但我认为它的工作原理如下:

如果要填充非 ObjectId 的字段,可以使用填充虚拟 (https://mongoosejs.com/docs/populate.html#populate-virtuals)。在这种情况下,您的模式应该是:

const ProgramsSchema = new mongoose.Schema({
   program_id: String,
   description: {
       type: String
   },
});
const schoolsSchema = new mongoose.Schema({
    inst_url: {
        type: String
    },
    programs: [
        {type: String, ref: "Programs"}
    ]
});

在您的学校模式中启用虚拟:

Schools.virtual('programs', {
  ref: 'Programs',
  localField: 'programs',
  foreignField: 'program_id'
});

然后,你应该存储program_id

Programs.find({program_id: p_id}).exec(function(err, data) {
    if (err) {
        console.log(err);
    } else {
        p_arr.push(data[0].program_id)
    }
})

和以前一样,您可以在需要时populate()

希望我帮到了你