it-swarm.com.de

Mungo: findOneAndUpdate gibt kein aktualisiertes Dokument zurück

Unten ist mein 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);
});

Ich habe bereits einen Datensatz in meiner Mongo-Datenbank und möchte diesen Code ausführen, um den Namen mit einem Alter von 17 Jahren zu aktualisieren und das Ergebnis am Ende des Codes auszudrucken.

Warum bekomme ich immer noch das gleiche Ergebnis von der Konsole (nicht den geänderten Namen), aber wenn ich zur Mongo-DB-Befehlszeile gehe und "db.cats.find();" eingebe? Das Ergebnis kam mit geändertem Namen.

Dann gehe ich zurück, um diesen Code erneut auszuführen, und das Ergebnis wird geändert.

Meine Frage ist: Wenn die Daten geändert wurden, warum habe ich dann beim ersten Mal noch Originaldaten erhalten, als console.log es.

215
Dreams

Die Standardeinstellung ist die Rückgabe des ursprünglichen, unveränderten Dokuments. Wenn Sie das neue, aktualisierte Dokument zurückgeben möchten, müssen Sie ein zusätzliches Argument übergeben: ein Objekt, dessen new -Eigenschaft auf true festgelegt ist.

Aus den Mungo-Dokumenten :

Abfrage # 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`
});

Verfügbare Optionen

  • new: bool - Wenn true , wird das geänderte zurückgegeben. Dokument und nicht das Original. ist standardmäßig false (geändert in 4.0)

Wenn Sie also das aktualisierte Ergebnis in der Variablen doc haben möchten:

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

    console.log(doc);
});
444
Cristy

Wenn Sie den Node.js-Treiber anstelle von Mongoose verwenden, sollten Sie {returnOriginal:false} anstelle von {new:true} verwenden.

57

Für "findOneAndUpdate" ist daher eine Option zum Zurückgeben des Originaldokuments erforderlich. Und die Option ist:

MongoDB Shell

{returnNewDocument: true}

Ref: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

Mungo

{new: true}

Ref: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

Node.js MongoDB-Treiber-API:

{returnOriginal: false}

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

41
Tsuneo Yoshioka

Standardmäßig gibt findOneAndUpdate das Originaldokument zurück. Wenn Sie möchten, dass das geänderte Dokument zurückgegeben wird, übergeben Sie ein Optionsobjekt { new: true } an die Funktion:

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

});
38

Für alle, die mit dem ES6/ES7-Stil mit nativen Versprechungen darüber gestolpert sind, hier ist ein Muster, das Sie übernehmen können ...

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 */ }
12
Assaf Moldavsky

Dies ist der aktualisierte Code für findOneAndUpdate. Es klappt.

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

Wenn Sie das geänderte Dokument zurückgeben möchten, müssen Sie die Option {new:true} API-Referenz festlegen, die Sie verwenden können Cat.findOneAndUpdate(conditions, update, options, callback) // executes

Von der offiziellen Mongoose API übernommen http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate Sie können die folgenden Parameter verwenden

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

Eine andere Implementierung, die nicht auf der offiziellen API-Seite zum Ausdruck kommt und die ich am liebsten verwende, ist die Promise -Basisimplementierung, mit der Sie .catch verwenden können, um all Ihre verschiedenen Fehler dort zu behandeln.

    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);
    });
2
Jonathan Thurft

Unten sehen Sie die Abfrage nach Mungos findOneAndUpdate. Hier wird new: true verwendet, um das aktualisierte Dokument abzurufen, und fields wird verwendet, um bestimmte Felder abzurufen.

z.B. 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();
0
Sourabh Khurana