Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

349
Vistas
¿Cómo actualizo un objeto en Mongoose?

He tenido problemas al actualizar los datos en la base de datos usando mongoose, por lo tanto, gracias de antemano por la ayuda.

He estado enviando algunos datos desde un formulario dinámico que contiene un conjunto diferente de campos cada vez... pero cuando actualizo la matriz en la base de datos, cambia esos campos.

Esta fue mi función de controlador antes: -

 exports.savePageContent = (req, res, next) => { const id = req.body.dest; // getting page data document id delete req.body.dest; var arr = []; // When we are returning the same page each time after we submit the data for the particuklar section form then how are we supposed to redirect the user to next page once he is done doing all var fieldKeys = Object.keys(req.body); for(let i = 0; i < fieldKeys.length; i++) { arr.push({fieldRef : fieldKeys[i], fieldValue : req.body[fieldKeys[i]]}); } pageDataModel.findByIdAndUpdate(id, {pageData : arr}).exec(function(err, result) { if(err){ console.log(err); } else { console.log("data is inserted"); req.flash('message', "Data Saved Successfully"); } }) }

También probé algunas actualizaciones y luego me mudé a esta parte.

Esta es mi nueva función de controlador:

 exports.savePageContent = (req, res, next) => { const pageid = req.body.dest; // getting page data document id delete req.body.dest; var fieldRefData = ""; var fieldValueData = ""; var fieldKeys = Object.keys(req.body); for(let i = 0; i < fieldKeys.length; i++) { fieldRefData = fieldKeys[i]; fieldValueData = req.body[fieldKeys[i]]; try{ pageDataModel.update({id : pageid, "pageData.fieldRef" : fieldRefData}, {$set : {"pageData.$.fieldValue" : fieldValueData }}, {upsert : true}).exec(function(err, result) { if(err){ console.log(err); } else { console.log("data is inserted", result); } }); req.flash('message', "Data Saved Successfully"); }catch(e){ console.log(e); req.flash('message', "error Occurred updating Data "); } } }

Para elaborar el caso para una mejor comprensión: -

Estos son los datos que vienen por primera vez en el cuerpo.

 [ { fieldRef: 'sec1.1.h1', fieldValue: 'this is the field value 1' }, { fieldRef: 'sec1.1.p', fieldValue: 'this is the field value 1' }, { fieldRef: 'sec1.1.a', fieldValue: 'this is the field value 1' }, { fieldRef: 'sec1.2.h2', fieldValue: 'this is the field value 1' } ]

y Estos son los datos que vienen la segunda vez: -

 [ { fieldRef: 'sec2.1.h1', fieldValue: 'this the field value 2' }, { fieldRef: 'sec2.1.p', fieldValue: 'this the field value 2' }, { fieldRef: 'sec2.1.a', fieldValue: 'this the field value 2' }, { fieldRef: 'sec2.2.h1', fieldValue: 'this the field value 2' } ]

cuando quiero que ambos datos estén en la base de datos, pero cuando envío uno, el segundo dato, el primero se actualiza al segundo y viceversa.

esta es la db imágenes del escenario

estos son los datos en el documento en la primera operación

estos son los datos en el documento de la segunda operación

No puedo mantenerlos y actualizarlos a ambos... así que por favor ayúdenme...

Este es el error que recibo la mayor parte del tiempo que dice que la consulta es incorrecta

 MongoServerError: The positional operator did not find the match needed from the query. at /home/pushkar/Desktop/NodejsWebApp1/node_modules/mongodb/lib/operations/update.js:80:33 at /home/pushkar/Desktop/NodejsWebApp1/node_modules/mongodb/lib/cmap/connection_pool.js:272:25 at handleOperationResult (/home/pushkar/Desktop/NodejsWebApp1/node_modules/mongodb/lib/sdam/server.js:370:9) at MessageStream.messageHandler (/home/pushkar/Desktop/NodejsWebApp1/node_modules/mongodb/lib/cmap/connection.js:479:9) at MessageStream.emit (events.js:400:28) at processIncomingData (/home/pushkar/Desktop/NodejsWebApp1/node_modules/mongodb/lib/cmap/message_stream.js:108:16) at MessageStream._write (/home/pushkar/Desktop/NodejsWebApp1/node_modules/mongodb/lib/cmap/message_stream.js:28:9) at writeOrBuffer (internal/streams/writable.js:358:12) at MessageStream.Writable.write (internal/streams/writable.js:303:10) at Socket.ondata (internal/streams/readable.js:731:22) { index: 0, code: 2 }

Además, si no pude aclarar mi escenario, deje un comentario e intentaré explicarlo más claramente ... gracias de antemano

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

$set reemplazará un nuevo valor para la clave. Si usa el tercer valor, $set reemplazará el tercer valor, use $push en lugar del operador $set .https://docs.mongodb.com/manual/reference/operator/update/push/

over 4 years ago · Santiago Trujillo Denunciar

0

Intente usar _id en lugar de id .

 pageDataModel.update({_id : pageid, "pageData.fieldRef"}) {

O incluso pageData._id en lugar de id .

 pageDataModel.update({'pageData._id' : pageid, "pageData.fieldRef"}) {

Además, su identificación es una string en la consulta, pero una object id en la base de datos, así que llame a un asistente.

 pageDataModel.update({'pageData._id' : mongoose.Types.ObjectId(pageid), "pageData.fieldRef"}) {
over 4 years ago · Santiago Trujillo Denunciar

0

Espero que esto debería resolver el problema:

 pageDataModel.updateOne({_id : "61d73f31cb5681b85618995a", "pageData.fieldRef" : "sec2.c" },{"$set" : {"pageData.$.fieldValue" : "Mkc" }}).exec(function(err, result) { if(err) throw err; else { console.log(result); } });
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda