Hoe krijg ik een bijgewerkt document terug van de findOneAndUpdate-methode?

Ik gebruik MongoDB met node js , ik gebruikte npm install mongodb

Ik wil een bestaand document bijwerken en het bijgewerkte document retourneren, het document is correct bijgewerkt. maar het geeft het oude document terug, betekent het originele document vóór de update. ik heb de parameter returnNewDocument:truegebruikt, maar geen gebruik .

           var filter = {
                '_id': object_id
            },
            update = {
                $set: { "status" : data["status"] },
                $push: {
                    "statusHistory": {
                        $each: [{ status:data["status"],statusChangedTime:data["statusChangedTime"],comment:data["comment"]}],
                        $position:0,
                    }
                },
            }
            ,options = {
                //upsert: false,
                //multi: false,
                returnNewDocument: true
            };
            col.findOneAndUpdate(filter, update, options,function(err, res) {
                if (err) {
                    console.log(err);
                }else {
                    console.log(res);
                }
            });

het antwoord is

{ lastErrorObject: { updatedExisting: true, n: 1 },
  value: 
   { 
//original document
   },     
  ok: 1 }

wanneer ik rechtstreeks naar mongoDB ga via terminal en probeer

db.MyCollection.find().pretty();

het document is correct bijgewerkt, het geeft alleen het origineel terug in plaats van het bijgewerkte.

Ik zit hier 2 uur vast, alle hulp wordt op prijs gesteld

in pakket.json

"mongodb": "^2.1.4",

Antwoord 1, autoriteit 100%

De Node.js stuurprogrammadocumentatievermeldt geen returnNewDocumentoptie voor findOneAndUpdate()(wat een optie is voor de MongoDB shell-opdrachtmet dezelfde naam).

In plaats daarvan vermeldt het een optie genaamd returnOriginal, die standaard is ingesteld op true. Probeer die optie te gebruiken door deze in te stellen op falseom het bijgewerktedocument terug te sturen in plaats van het origineel.


Antwoord 2, autoriteit 12%

Om het bijgewerkte document te krijgen nadat we de update hebben uitgevoerd, moeten we de optie "returnDocument" : "after"gebruiken samen met "returnOriginal" : false.

Volgens de nieuwste documentatie van mongodb node driver v3.6, het gebruik van returnOriginal is verouderd. Maar wanneer ik alleen "returnDocument" : 'after'probeer op te nemen zonder "returnOriginal":false, wordt het oorspronkelijke record geretourneerd in plaats van het bijgewerkte record.
Als u ze beide gebruikt, krijgt u de gewenste uitvoer van een bijgewerkt record in plaats van het originele record.
(bron: http://mongodb.github.io/ node-mongodb-native/3.6/api/Collection.html#findOneAndUpdate)

De optie
"returnNewDocument" : trueis een mongo-shell-optie en werkt mogelijk niet in de node-driver volgens de officiële mongodb-documentatie (hier vermeld https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/)


Antwoord 3, autoriteit 10%

Als je deze laatste 2018 ziet, werkt returnNewDocument:true en returnOriginal: false niet. U moet in plaats daarvan een eigenschap met de naam new instellen op true zoals in {.., new: true} in het optie-object voor uw zoekopdracht.


Antwoord 4

Dit werkte voor mij.

req.db.collection(collectionName).findOneAndUpdate(
          { _id : commentById._id }, // matching parameters
           updateOpts, //updating parameters
          {returnOriginal: false}  //don't use **returnNewDocument**
         );

Other episodes