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中更改)
所以,如果你想在doc
variables中更新结果:
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 } )