以下是我的代码
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时仍然可以获得原始数据。
答案 0 :(得分:420)
默认是返回原始的,未经更改的文档。如果要返回新的更新文档,则必须传递一个附加参数:new
属性设置为true
的对象。
<强>查询#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` });
可用选项
new
:bool - 如果 true ,则返回已修改文档,而不是原始文档。 默认为false (在4.0中更改)
因此,如果您想要更新doc
变量中的结果:
Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
if (err) {
console.log("Something wrong when updating data!");
}
console.log(doc);
});
答案 1 :(得分:51)
对于使用Node.js驱动程序而非Mongoose的任何人,您都希望使用<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Provident hic impedit reprehenderit voluptates, voluptatibus ut explicabo, repudiandae, reiciendis soluta <span>facere in cum eveniet architecto sint.</span></p>
而不是{returnOriginal:false}
。
答案 2 :(得分:37)
默认情况下findOneAndUpdate会返回原始文档。如果您希望它返回修改后的文档,则将选项对象{ new: true }
传递给函数:
Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {
});
答案 3 :(得分:34)
因此,“findOneAndUpdate”需要一个选项来返回原始文档。而且,选项是:
{returnNewDocument: true}
参考:https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
{new: true}
参考:http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate
{returnOriginal: false}
参考:http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate
答案 4 :(得分:12)
对于那些使用本机承诺的ES6 / ES7风格偶然发现的人,这里有一个你可以采用的模式......
if(db.ZoekresultaatWerkvorms.Any(r => r.Werkvorm.Equals(parameter.Naam)))
答案 5 :(得分:9)
这是findOneAndUpdate
的更新代码。它有效。
db.collection.findOneAndUpdate(
{ age: 17 },
{ $set: { name: "Naomi" } },
{
returnNewDocument: true
}
)
答案 6 :(得分:2)
如果您想要退回更改的文档,则需要设置选项{new:true}
API参考,您可以使用Cat.findOneAndUpdate(conditions, update, options, callback) // executes
官方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);
});
答案 7 :(得分:2)
这里的猫鼬维护者。您需要将new
选项设置为true
(或将returnOriginal
设置为false
)
await User.findOneAndUpdate(filter, update, { new: true });
// Equivalent
await User.findOneAndUpdate(filter, update, { returnOriginal: false });
请参见Mongoose findOneAndUpdate()
docs和this tutorial on updating documents in Mongoose。
答案 8 :(得分:1)
我知道,我已经迟到了,但是让我在这里添加我的简单且有效的答案
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)
答案 9 :(得分:0)
下面显示了猫鼬findOneAndUpdate
的查询。这里的new: true
用于获取更新的文档,而fields
则用于获取特定字段。
例如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();
答案 10 :(得分:0)
在某些情况下,{new: true}
无法正常工作。
然后您可以尝试一下。
{'returnNewDocument':true}