我使用nodejs/express/mongoose/angularjs.我想更新一个名为Lists的集合,它有几个属性,其中一个是项目数组.在下面的代码中,我在items数组中推送一个新的任务项.一切正常,但更新功能不会发回更新的集合,然后我必须对数据库执行另一个查询.有没有更有效的方法来做到这一点?
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)); }); } }); };
此外,数组项是ObjectIds的数组.这些项目位于单独的模式中,因此位于单独的集合中.是否可以推送整个对象,而不仅仅是其_id,以便不会创建另一个集合?
该更新方法 不返回更新的文档:
但是,如果我们不需要在我们的应用程序中返回的文档而只是想直接更新数据库中的属性,那么Model#update适合我们.
如果您需要更新并退回文档,请考虑以下选项之一:
传统方法:
Lists.findById(listId, function(err, list) { if (err) { ... } else { list.items.push(taskId) list.save(function(err, list) { ... }); } });
更短的方法:
Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) { ... });
使用findOneAndUpdate()方法并在查询参数中使用选项{{new":true}
return this.sessionModel .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true}) .exec() .then(data=>{ return { sid: data.session_id } })