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 APILa 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!
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); } }) }Hay dos formas de hacer esto:
arrayFilters - Docu más flexibleLa 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); } }); }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); } }); }