tag content attribute javascript node.js mongodb express mongoose

javascript - content - Devolver la colección actualizada con mangosta



title tag html (3)

El método de actualización no devuelve el documento actualizado:

Sin embargo, si no necesitamos que el documento sea devuelto en nuestra aplicación y simplemente deseamos actualizar una propiedad en la base de datos directamente, la actualización del Modelo # es la correcta para nosotros.

Si necesita actualizar y devolver el documento, considere una de las siguientes opciones:

Enfoque tradicional:

Lists.findById(listId, function(err, list) { if (err) { ... } else { list.items.push(taskId) list.save(function(err, list) { ... }); } });

Un enfoque más corto:

Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) { ... });

Trabajo con nodejs / express / mongoose / angularjs. Me gustaría actualizar una colección llamada Listas que tiene varias propiedades, una de las cuales es una matriz de elementos. En el siguiente código, estoy presionando una nueva tarea en la matriz de elementos. Todo funciona bien, sin embargo, la función de actualización no devuelve la colección actualizada, luego debo realizar otra consulta en la base de datos. ¿Hay una manera más eficiente de hacer esto?

El código nodejs / express:

exports.addTaskToList = function(req, res) { var listId = req.params.Id; var taskId = req.params.TaskId; Lists.update({_id: listId}, {$push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){ if(err) { console.log(''Error updating todo list. '' + err); } else{ console.log(result + '' todo list entry updated - New task added''); Lists.findById(listId).populate(''items'').exec(function (err, updatedEntry) { if (err) { console.log(''Unable to retrieve todo list entry.''); } res.send(JSON.stringify(updatedEntry)); }); } }); };

Además, los elementos de matriz son una matriz de ObjectIds. Esos elementos están en un esquema separado, por lo que en una colección separada. ¿Es posible empujar todo el objeto y no solo su _id para que no se cree otra colección?


Respecto a tu última pregunta:

¿Es posible empujar todo el objeto y no solo su _id para que no se cree otra colección?

La respuesta es sí. Puede almacenar sub-documentos dentro de documentos con bastante facilidad con Mongoose ( documentación sobre sub-documentos aquí ). Al cambiar un poco su esquema, puede empujar todo su objeto (no solo el elemento _id ) en una matriz de elementos definidos en su esquema de lista. Pero necesitarás modificar tu esquema, por ejemplo:

var itemSchema = new Schema({ // Your Item schema goes here task: ''string'' // For example }); var listSchema = new Schema({ // Your list schema goes here listName: String, // For example... items: [itemSchema] // Finally include an array of items });

Al agregar un objeto de item a la propiedad de items de una lista y luego guardar esa lista, su nuevo elemento se conservará en la colección de listas. Por ejemplo,

var list = new List({ listName: "Things to do" }); list.items.push({ task: "Mow the lawn" }); list.save(function(error, result) { if (error) // Handle error console.log(result.list) // Will contain your item instance });

Por lo tanto, cuando cargue su lista, la propiedad de items vendrá previamente rellenada con su matriz de elementos.

Esto se debe a que los elementos ya no persistirán en una colección separada. Se conservará en la colección de listas como un sub-documento de una lista.


use el método findOneAndUpdate () y en la opción de uso del parámetro de consulta como {"nuevo": verdadero}

return this.sessionModel .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true}) .exec() .then(data=>{ return { sid: data.session_id } })