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

165
Views
¿Cómo empujar dentro de una matriz anidada de objetos que tienen un valor preciso de una clave en MongoDB?

Tengo una pregunta sobre un problema que no puedo solucionar. Intento actualizar push una cadena pasada a través de Query en mi colección de mongoose. Mi colección es así:

 { "_id": { "$oid": "6199288597e42bf84d017f9e" }, "name": "Lisa", "surname": "Bianchi", "ID_school": "afbH598U3", "classes": [ { "class": "5A", "activities": { "in_progress": [], "finisched": [] }, "_id": { "$oid": "6199288597e42bf84d017f9f" } }, { "class": "1A", "activities": { "in_progress": [], "finisched": [] }, "_id": { "$oid": "6199288597e42bf84d017fa0" } } ], "email": "insegnante@a.com", "__v": 0 }

y trato de insertar una cadena en la matriz in_progress que coincida, por ejemplo, con class:"5A" de esta manera:

 import db from "../models/index.js"; const Teacher = db.teacher const updateActivity = (req, res) => { const query = { _id: req.query.id}; const update = {$push:{'classes.$[group].activities.in_progress': req.query.data } }; const options = {arrayFilters: { 'group.class': req.query.class }}; Teacher.findOneAndUpdate(query, update, options).exec((err, data) => { if (err) { res.status(400).send({ message: err }); return; } else { res.status(200).send(data); } }) } const API = { updateActivity } export default API

La consulta funciona bien, pero no se envió nada. Probé con Insomnia pasando en el campo Consulta

 id = 6199288597e42bf84d017f9e; class:'5A'; data:"pushed"

¿Cualquier sugerencia? ¡Gracias!

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

intente de esta manera pasando classes.class en consulta y también cambie push a $push:{'classes.$.activities.in_progress': req.query.data }

 const updateActivity = (req, res) => { const query = { _id: req.query.id ,'classes.class': req.query.class}; const update = {$push:{'classes.$.activities.in_progress': req.query.data } }; Teacher.updateOne(query,update).exec((err, data) => { if (err) { res.status(400).send({ message: err }); return; } else { res.status(200).send(data); } }) }
about 4 years ago · Juan Pablo Isaza Report

0

Hay dos formas de hacer esto:

Opción 1: arrayFilters - Docu más flexible

La opción que está utilizando. Tiene un error de sintaxis: arrayFilters debe ser una matriz de documentos.

 const updateActivity = (req, res) => { const query = { _id: req.query.id }; const update = { $push:{ 'classes.$[group].activities.in_progress': req.query.data } }; // This MUST be an array of filter documents! const options = { arrayFilters: [{ 'group.class': req.query.class }] }; Teacher .findOneAndUpdate(query, update, options) .exec((err, data) => { if (err) { res.status(400).send({ message: err }); return; } else { res.status(200).send(data); } }); }

Opción 2: a través de consulta (como respondió @Saurabh Mistry )

Repitiendo su respuesta para completar

Especificando una consulta que apunta a un elemento particular en una matriz dentro de los documentos de resultados.

 const updateActivity = (req, res) => { const query = { _id: req.query.id, 'classes.class': req.query.data, }; const update = { $push:{ 'classes.$.activities.in_progress': req.query.data } }; Teacher .findOneAndUpdate(query, update, options) .exec((err, data) => { if (err) { res.status(400).send({ message: err }); return; } else { res.status(200).send(data); } }); }
about 4 years ago · Juan Pablo Isaza 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!