Mongoose:findOneAndUpdate不会返回更新的文档

以下是我的代码

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); }); 

我已经在我的mongo数据库中有一些logging,我想运行这个代码来更新哪个年龄为17的名字,然后在代码的最后打印结果。

但是,为什么我仍然从控制台得到相同的结果(不修改名称),但是当我去到mongo db命令行并键入“db.cats.find();”。 结果是修改。

然后我又回到运行这个代码,结果被修改。

我的问题是:数据被修改,但为什么我仍然在console.log时第一次得到原始数据。

默认是返回未改变的文档。 如果你想要返回新的更新的文档,你必须传递一个额外的参数:一个new属性设置为true的对象。

http://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

查询#findOneAndUpdate

 function(error, doc) { // error: any errors that occurred // doc: the document before updates are applied if `new: false`, or after updates if `new = true` } 

可用选项

new :布尔 – 如果是true,返回修改的文件,而不是原来的。 默认为false (在4.0中更改)

所以,如果你想在docvariables中更新结果:

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

默认情况下, findOneAndUpdate返回原始文档。 如果您希望它返回修改后的文档,则将一个选项对象{ new: true }传递给该函数:

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

对于任何使用Node.js驱动程序而不是Mongoose的人,您都需要使用{returnOriginal:false}而不是{new:true}

对于谁使用ES6 / ES7风格与原生承诺偶然发现,这里是一种模式,你可以采用…

 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 */ } 

这是findOneAndUpdate的更新代码。 有用。

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