下面是我的代码
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数据库中有一些记录,我想运行这段代码来更新年龄为17岁的名称,然后在代码的末尾打印结果。
然而,为什么我仍然从控制台得到相同的结果(不是修改后的名称),但当我进入mongo db命令行并键入“db.cats.find();”。结果是修改后的名称。
然后我返回去再次运行这段代码,结果被修改了。
我的问题是:如果数据被修改了,那么为什么我仍然在console.log它的第一时间得到原始数据。
因此,“findOneAndUpdate”需要一个选项来返回原始文档。选项是:
MongoDB shell
{returnNewDocument:真}
裁判:https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
猫鼬
{新:真}
裁判:http://mongoosejs.com/docs/api.html # query_Query-findOneAndUpdate
MongoDB Driver API:
{returnOriginal:假}
2021年- Mongodb ^4.2.0更新
{returnDocument: 'after'}
裁判:http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html # findOneAndUpdate
确保你检查你使用的是Mongoose还是MongoDB
如果使用Mongoose -使用{new: true}
const query = await Model.findOneAndUpdate({filter}, {update}, {new: true});
如果使用MongoDB -使用{returnNewDocument: true}
const query = await Model.findOneAndUpdate({filter}, {update}, {returnNewDocument: true});
确保你用的是正确的,因为如果你不这样做,它就会被省略,你就会得到旧文档。
因此,“findOneAndUpdate”需要一个选项来返回原始文档。选项是:
MongoDB shell
{returnNewDocument:真}
裁判:https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
猫鼬
{新:真}
裁判:http://mongoosejs.com/docs/api.html # query_Query-findOneAndUpdate
MongoDB Driver API:
{returnOriginal:假}
2021年- Mongodb ^4.2.0更新
{returnDocument: 'after'}
裁判:http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html # findOneAndUpdate
我是猫鼬的维护者。您需要将新选项设置为true(或等效地将returnorigoriginal设置为false)
await User.findOneAndUpdate(filter, update, { new: true });
// Equivalent
await User.findOneAndUpdate(filter, update, { returnOriginal: false });
请参阅Mongoose findOneAndUpdate()文档和在Mongoose中更新文档的教程。
如果你想返回修改后的文档,你需要设置选项{new:true} API引用,你可以使用Cat。findOneAndUpdate(conditions, update, options, callback) //执行
通过官方的Mongoose API http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate,您可以使用以下参数
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
另一个没有在官方API页面中表达的实现是我更喜欢使用的Promise基实现,它允许你有.catch,在那里你可以处理所有的各种错误。
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);
});