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 new
ingesteld 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 doc
Variabele:
// 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 new
instellen op true
(of, equivalent, returnOriginal
op 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 .catch
kunt 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: true
wordt gebruikt om de bijgewerkte doc en fields
te 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}