Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

169
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda