我目前正在嘗試通過 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);
我基本上可以將所有學校資料添加到資料庫中,但沒有一個程式被填充。我想知道是否有辦法做到這一點以及最佳做法是什么。如果你們需要更多資訊或者我的問題不清楚,請告訴我。
uj5u.com熱心網友回復:
您的貓鼬模式存在一些問題。根據您的貓鼬模式,您嘗試執行的操作find不可用。您不能從“程式”填充到“學校”。您可以從“學校”填充到“程式”,例如:
Schools.find().populate(programs)
要做到這一點,您的模式需要進行一些更改。這個想法是將程式存盤_id在您的programs陣列中的學校集合中,并能夠通過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)
}
})
您的檔案應該正確插入。programs現在您可以在執行查詢時填充School,正如我上面指出的:
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"}
]
});
在您的 School 架構中啟用虛擬:
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()在需要時使用。
我希望我有所幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/443298.html
