Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Update And Return Document In Mongodb

I want to get updated documents. This is my original code and it successfully updates but doesn't return the document.

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {                         res.send({error: err, affected: results});                         db.close();                     }); 

I used the toArray function, but this gave the error "Cannot use a writeConcern without a provided callback":

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}).toArray( function(err, results) {                     res.send({error: err, affected: results});                     db.close();                 }); 

Any ideas?

like image 979
user3803096 Avatar asked Jul 14 '14 22:07

user3803096


People also ask

What does update in MongoDB return?

collection. update() will only report the number of documents that were affected to its own callback.

Can we update document in MongoDB?

MongoDB's update() and save() methods are used to update document into a collection. The update() method updates the values in the existing document while the save() method replaces the existing document with the document passed in save() method.

What does findOneAndUpdate return?

By default, findOneAndUpdate() returns the document as it was before update was applied. You should set the new option to true to return the document after update was applied.


2 Answers

The solution is to set: {returnOriginal: false}.

collection.findOneAndUpdate(         whereObj,         updateObj,         {returnOriginal: false}); 
like image 42
milosnkb Avatar answered Oct 20 '22 19:10

milosnkb


collection.update() will only report the number of documents that were affected to its own callback.

To retrieve the documents while modifying, you can use collection.findOneAndUpdate() instead (formerly .findAndModify()).

collection.findOneAndUpdate(     { "code": req.body.code },     { $set: req.body.updatedFields },     { returnOriginal: false },     function (err, documents) {         res.send({ error: err, affected: documents });         db.close();     } ); 

The returnOriginal option (or new with Mongoose) lets you specify which version of a found document (original [default] or updated) is passed to the callback.

returnOriginal was deprecated in version 3.6. Use returnDocument: "before" | "after" for version 3.6 and later.


Disclaimer: This answer currently refers to the Node.js Driver as of version 3.6. As new versions are released, check their documentation for possibly new deprecation warnings and recommended alternatives.

like image 197
Jonathan Lonowski Avatar answered Oct 20 '22 20:10

Jonathan Lonowski