如何使用数据库中的现有数据使用 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()
。
希望我帮到了你
我目前正在尝试通过 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()
。
希望我帮到了你