Actualmente estoy tratando de insertar una gran cantidad de modelos a través de insertMany, pero parece que no puedo descifrar cómo llenar la matriz al crear un objeto. Soy relativamente nuevo en Mongoose y agradecería cualquier ayuda, aquí está el código que tengo ahora.
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"}] } });Y aquí está el código donde trato de crear varias escuelas y agregarlo a la base de datos.
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);Básicamente, puedo agregar todos los datos de la escuela a la base de datos, pero ninguno de los programas se completa. Me preguntaba si había una manera de hacer esto y cuál era la mejor práctica. Por favor, háganme saber si necesitan más información o si mi pregunta no fue clara.
Hay algunos problemas con sus esquemas de mangosta. La operación que está tratando de hacer en find no está disponible, según sus esquemas de mangosta. No puede completar de "Programas" a "Escuelas". Puede completar desde "Escuelas" hasta "Programas", por ejemplo:
Schools.find().populate(programs) Y para hacer eso, son necesarios varios cambios en sus esquemas. La idea es almacenar los programas _id en su matriz de programs en la colección School y poder obtener la información de los programas a través de populate() , ya sea regular o 'custom populate' (poblar virtuales).
populate() Cambiaría el schoolsSchema de escuelas para almacenar una matriz de _id en programs :
const schoolsSchema = new mongoose.Schema({ inst_url: { type: String }, programs: [ {type: String, ref: "Programs"} ] }); También debe cambiar ProgramsSchema :
const ProgramsSchema = new mongoose.Schema({ _id: Schema.Types.ObjectId, // that's important description: { type: String }, });Y ahora, puedes hacer:
Programs.find({_id: p_id}).exec(function(err, data) { if (err) { console.log(err); } else { p_arr.push(data[0]._id) } }) Sus documentos deben insertarse correctamente. Y ahora puede completar programs cuando realiza una consulta sobre School , como indiqué anteriormente:
Schools.find().populate(programs)La otra manera. En primer lugar, nunca lo he intentado de esta manera, pero creo que funciona de la siguiente manera:
Si desea completar campos que no son ObjectId , puede usar poblar virtuales ( https://mongoosejs.com/docs/populate.html#populate-virtuals ). En ese caso, sus esquemas deberían ser:
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"} ] });Habilite virtual en el esquema de su escuela:
Schools.virtual('programs', { ref: 'Programs', localField: 'programs', foreignField: 'program_id' }); Luego, debe almacenar 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) } }) Y como antes, puede populate() cuando lo necesite.
espero haber ayudado