Update And Return Document In Mongodb

后端 未结 4 1903
南笙
南笙 2020-11-29 09:39

I want to get updated documents. This is my original code and it succesfully updates but doesnt return the document.

collection.update({ \"code\": req.bo         


        
相关标签:
4条回答
  • 2020-11-29 10:22

    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.


    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.

    0 讨论(0)
  • 2020-11-29 10:28

    Checkout the WriteResult object:

    http://docs.mongodb.org/manual/reference/method/db.collection.update/#writeresults-update

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

    result should have something like:

    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    

    If you want the updated results, do another query with the primary key.

    0 讨论(0)
  • 2020-11-29 10:29

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

    collection.findOneAndUpdate(
            whereObj,
            updateObj,
            {returnOriginal: false});
    
    0 讨论(0)
  • 2020-11-29 10:46

    Could not find any way to update many and return the modified records in docs, so I made a workaround.

    At least one fault that I can find with below method is, you would not be able to tell if document is modified or already had the value that you are using:

    function findAndUpdateMany(filter, updateOptions) {
      return collection.find(filter).project({_id: 1}).toArray()
        .then(function(matchingIds) {
          filter = {_id: {$in: matchingIds}}
          return collection.updateMany(filter, updateOptions)
        }).then(function() {
          return collection.find(filter).toArray()
        })
    }
    
    0 讨论(0)
提交回复
热议问题