Ci-dessous mon 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);
});
J'ai déjà un enregistrement dans ma base de données mongo et je voudrais exécuter ce code pour mettre à jour le nom de l'âge de 17 ans, puis imprimer le résultat à la fin du code.
Cependant, pourquoi j'obtiens toujours le même résultat de la console (pas le nom modifié) mais quand je vais sur la ligne de commande mongo db et que je tape " db.cats.find();
". Le résultat est venu avec un nom modifié.
Ensuite, je reviens pour exécuter à nouveau ce code et le résultat est modifié.
Ma question est: si les données ont été modifiées, alors pourquoi j'ai quand même obtenu les données d'origine lors de la première utilisation de console.log.
{ returnOriginal: false }
Pour toute personne utilisant le pilote Node.js au lieu de Mongoose, vous voudrez utiliser à la
{returnOriginal:false}
place de{new:true}
.la source
Ainsi, "findOneAndUpdate" nécessite une option pour retourner le document d'origine. Et, l'option est:
Shell MongoDB
{returnNewDocument: true}
Réf: https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
Mangouste
{new: true}
Réf: http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate
API du pilote Node.js MongoDB:
{returnOriginal: false}
Réf: http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate
la source
'returnDocument' => FindOneAndUpdate::RETURN_DOCUMENT_AFTER
Par défaut, findOneAndUpdate renvoie le document d'origine. Si vous souhaitez qu'il renvoie le document modifié, passez un objet options
{ new: true }
à la fonction:la source
_id
nul?Pour ceux qui sont tombés sur cela en utilisant le style ES6 / ES7 avec des promesses natives, voici un modèle que vous pouvez adopter ...
la source
Il s'agit du code mis à jour pour
findOneAndUpdate
. Ça marche.la source
Mainteneur de mangouste ici. Vous devez définir l'
new
option surtrue
(ou, de manière équivalente,returnOriginal
surfalse
)Voir les documents Mongoose
findOneAndUpdate()
et ce tutoriel sur la mise à jour des documents dans Mongoose .la source
Si vous souhaitez renvoyer le document modifié, vous devez définir l'option de
{new:true}
référence API que vous pouvez utiliserCat.findOneAndUpdate(conditions, update, options, callback) // executes
Pris par l'API officielle Mongoose http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate, vous pouvez utiliser les paramètres suivants
Une autre implémentation qui n'est pas exprimée dans la page officielle de l'API et c'est ce que je préfère utiliser est l'
Promise
implémentation de base qui vous permet d'avoir.catch
là où vous pouvez traiter toutes vos diverses erreurs.la source
Ci-dessous montre la requête pour mangouste
findOneAndUpdate
. Icinew: true
est utilisé pour obtenir le document mis à jour etfields
est utilisé pour obtenir des champs spécifiques.par exemple.
findOneAndUpdate(conditions, update, options, callback)
la source
Je sais, je suis déjà en retard mais permettez-moi d'ajouter ma réponse simple et fonctionnelle ici
la source