Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

158
Views
¿Cómo creo una cantidad de objetos con insertMany con datos existentes de la base de datos?

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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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).

Relleno regular 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)

Poblar virtual

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

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!