Mongoose: findOneAndUpdate geeft geen bijgewerkt document terug

Hieronder staat mijn code

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var Cat = mongoose.model('Cat', {
    name: String,
    age: {type: Number, default: 20},
    create: {type: Date, default: Date.now} 
});
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }
    console.log(doc);
});

Ik heb al een record in mijn Mongo-database en ik zou deze code willen uitvoeren om de naam bij te werken waarvoor de leeftijd 17 is en het resultaat aan het einde van de code af te drukken.

Waarom krijg ik echter nog steeds hetzelfde resultaat van de console (niet de gewijzigde naam), maar wanneer ik naar de mongo db-opdrachtregel ga en “db.cats.find();” typ. Het resultaat kwam met een gewijzigde naam.

Dan ga ik terug om deze code opnieuw uit te voeren en het resultaat wordt gewijzigd.

Mijn vraag is: als de gegevens zijn gewijzigd, waarom kreeg ik dan nog steeds de originele gegevens toen console.log het deed.


Antwoord 1, autoriteit 100%

Waarom gebeurt dit?

De standaardis om het originele, ongewijzigdedocument terug te geven. Als u wilt dat het nieuwe, bijgewerkte document wordt geretourneerd, moet u een extra argument doorgeven: een object met de eigenschap newingesteld op true.

Van de mangoose-documenten:

Query#findOneAndUpdate

Model.findOneAndUpdate(conditions, update, options, (error, doc) => {
  // error: any errors that occurred
  // doc: the document before updates are applied if `new: false`, or after updates if `new = true`
});

Beschikbare opties

  • new: BOOL – Als True , retourneer het gewijzigd document in plaats van het origineel. standaardinstellingen naar valse (gewijzigd in 4.0)

Oplossing

PASSEN {new: true}Als u het bijgewerkte resultaat wilt in de docVariabele:

//                                                         V--- THIS WAS ADDED
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }
    console.log(doc);
});

Antwoord 2, Autoriteit 16%

Voor iedereen die het Node.js-stuurprogramma gebruikt in plaats van Mongoose, wilt u {returnOriginal:false}gebruiken in plaats van {new: true}.


Antwoord 3, Autoriteit 11%

Dus, “FindOneAreAndupdate” vereist een optie om het originele document te retourneren. En, de optie is:

MongoDB Shell

{returnNewDocument: true}

Ref: https://docs.mongodb.com/manual /Reference/method/db.collection.findoneandupdate/

Mongoose

{new: true}

Ref: http://mongoosejs.com/docs/api.html#query_query- FindOneAndupdate

NODE.JS MongoDB Driver API:

{returnOriginal:false}

Ref: http://mongodb.github. io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate


Antwoord 4, autoriteit 7%

Standaard retourneert findOneAndUpdatehet originele document. Als u wilt dat het gewijzigde document wordt geretourneerd, geeft u een optie-object { new: true }door aan de functie:

Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {
});

Antwoord 5, autoriteit 3%

Voor wie dit tegenkwam met behulp van de ES6 / ES7-stijl met native beloften, hier is een patroon dat u kunt adopteren…

const user = { id: 1, name: "Fart Face 3rd"};
const userUpdate = { name: "Pizza Face" };
try {
    user = await new Promise( ( resolve, reject ) => {
        User.update( { _id: user.id }, userUpdate, { upsert: true, new: true }, ( error, obj ) => {
            if( error ) {
                console.error( JSON.stringify( error ) );
                return reject( error );
            }
            resolve( obj );
        });
    })
} catch( error ) { /* set the world on fire */ }

Antwoord 6, autoriteit 2%

Dit is de bijgewerkte code voor findOneAndUpdate. Het werkt.

db.collection.findOneAndUpdate(    
  { age: 17 },      
  { $set: { name: "Naomi" } },      
  {
     returnNewDocument: true
  }    
)

Antwoord 7, autoriteit 2%

Mongoose-beheerder hier. U moet de optie newinstellen op true(of, equivalent, returnOriginalop false)

await User.findOneAndUpdate(filter, update, { new: true });
// Equivalent
await User.findOneAndUpdate(filter, update, { returnOriginal: false });

Bekijk Mongoose findOneAndUpdate()-documentenen deze tutorial over het bijwerken van documenten in Mongoose.


Antwoord 8

Als u het gewijzigde document wilt retourneren, moet u de optie {new:true}API-referentie instellen, u kunt Cat.findOneAndUpdate(conditions, update, options, callback) // executes

Genomen door de officiële Mongoose API http://mongoosejs.com/docs/api.html# findoneandupdate_findOneAndUpdateu kunt de volgende parameters gebruiken

A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options)  // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update)           // returns Query
A.findOneAndUpdate()                             // returns Query

Een andere implementatie die niet wordt uitgedrukt in de officiële API-pagina en die ik het liefst gebruik, is de Promise-basisimplementatie waarmee je .catchkunt hebben waar je kunt behandel al uw verschillende fouten daar.

   let cat: catInterface = {
        name: "Naomi"
    };
    Cat.findOneAndUpdate({age:17}, cat,{new: true}).then((data) =>{
        if(data === null){
            throw new Error('Cat Not Found');
        }
        res.json({ message: 'Cat updated!' })
        console.log("New cat data", data);
    }).catch( (error) => {
        /*
            Deal with all your errors here with your preferred error handle middleware / method
         */
        res.status(500).json({ message: 'Some Error!' })
        console.log(error);
    });

Antwoord 9

Hieronder toont de query voor Mongoose’s findOneAndUpdate. Hier new: truewordt gebruikt om de bijgewerkte doc en fieldste krijgen, wordt gebruikt voor specifieke velden om te krijgen.

bijvoorbeeld. findOneAndUpdate(conditions, update, options, callback)

await User.findOneAndUpdate({
      "_id": data.id,
    }, { $set: { name: "Amar", designation: "Software Developer" } }, {
      new: true,
      fields: {
        'name': 1,
        'designation': 1
      }
    }).exec();

Antwoord 10

Ik weet het, ik ben al laat, maar laat me mijn eenvoudig en werken antwoord hier

const query = {} //your query here
const update = {} //your update in json here
const option = {new: true} //will return updated document
const user = await User.findOneAndUpdate(query , update, option)

Antwoord 11

In sommige scenario’s {new: true}werkt niet.
Dan kun je dit proberen.

{'returnNewDocument':true}

Other episodes