我必须丢失一些东西,但是看来我的Document.prototype.save()
在Mongoose 5.2.10中无法正常工作。
The docs say,表示回调函数返回了已保存的文档。
回调将收到两个参数
err
(如果发生错误)product
已保存product
对我来说,似乎是在更新和保存之前返回了文档的原始版本。我做错了什么,或者文档有点误导或含糊。
调用save之后,文档将在数据库中更新,但回调函数会返回修改前的旧文档。
我一直在这样调用save(在异步函数内部):
const myDocument = await User.findOne({ name: 'billy' });
const updatedInfo = {
foo: 'update here',
bar: 'some other new stuff'
};
myDocument.update({ $set: updatedInfo }, (err) => { console.log(err) });
myDocument.save((err, savedDoc) => {
if (err) { console.log(err); }
// Should return saved doc here
console.log(savedDoc);
});
像这样:
myDocument.update({ $set: updatedInfo }, (err) => { console.log(err) });
myDocument.save().then((savedDoc) => {
// Should return saved doc here
console.log(savedDoc);
}).catch((err) => { console.log(err); });
但是无法将其返回给我保存的文档。 savedDoc
最终是文档的旧版本,而新版本的确保存在数据库中。
答案 0 :(得分:1)
将findOneAndUpdate
与{new : true}
一起使用以获取新版本
Model.findOneAndUpdate({statue: 'active'}, {$set:{qtt:0}}, {new: true}, function(err, doc){
if(err){
console.log("Something wrong when updating data!");
}
console.log(doc);
});
答案 1 :(得分:0)
使用the help of some of the Mongoose collaboraters,我发现问题是我同时使用了document.update()
函数和document.save()
函数。
document.update()
函数是带有回调的单独异步操作,如@Industrial Comet所提到的,它不返回文档。
为了进行更改,以将其应用到保存的,返回的文档版本中,您需要将以下更改直接应用于文档对象:
myDocument.foo = 'new info';
myDocument.bar = 'other new info';
myDocument.save((err, newDocument) => {
// new Document available here
});
编辑:
I found out ,您还可以使用myDocument.set(objectOfUpdatedInfo)
使用更新信息的对象来更新一堆不同的值,然后获取由myDocument.save()
返回的已保存文档
所以我的解决方案是这样做:
myDocument.set(objectOfUpdatedInformation);
myDocument.save().then((savedDoc) => {
res.json({ response: 'success' savedDoc: savedDoc });
}).catch((err) => { console.log(err); });
下面是我对document.protype.save()
存在之前的情况的初步评估。 (由于无法彻底阅读文档而使自己感到特别悲伤)
但是我想用一个对象中的许多不同字段来更新我的文档。我希望能够做到这一点,然后获得更新的文档。看来我无法使用 myDocument.update(objectOfUpdatedInfo)
进行此操作,原因是:
.update()
方法未在回调中提供更新的信息.update()
方法之后使用了save,则所做的更改不会显示在返回的已保存文档中。 所以我的选择是:
.save()
。Collection.findOneAndUpdate()
更新。 Document.save()
和Collection.findOneAndUpdate()
都返回更新的文档,但是Document.save()
不能与Document.update()
一起使用,而Document.update()
则不能返回文档。
我希望能够将充满更新信息的对象干净地插入到已经查询过的 myDocument
对象中,然后返回更新文档,但是不幸的是,现在还没有。猫鼬似乎不可能。我问了这个问题,可能会有进一步的讨论in this github issue。目前,这是我选择的使用具有计算的键值的更新的解决方案:
// Need to a document with an object full of values...
for (var property in updatedInfo) {
myDocument[property] = updatedInfo[property];
}
myDocument.save().then((savedDoc) => {
res.json({ response: 'success' savedDoc: savedDoc });
}).catch((err) => { console.log(err); });
答案 2 :(得分:-1)
猫鼬更新功能不返回更新后的文档。另外,使用更新功能进行的更改是单独的异步操作,不应与更新功能一起使用。
保存并返回更新的文档
docs.findById(id,(err,myDocument)=> { //选择要更改的文档 myDocument.foo = //更新的内容 myDocument.save((err,newDocument)=> { //返回新文档 }) })