>我一定错过了什么,但我的Document.prototype.save()
似乎在猫鼬 5.2.10 中无法正常工作。
文档说回调返回保存的文档。
回调将收到两个参数
err
是否发生错误product
哪个是保存的product
对我来说,它似乎是在更新和保存之前返回文档的原始版本。要么我做错了什么,要么文档有点误导或含糊不清。
调用 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
最终成为文档的旧版本,而新版本确实保存在数据库中。
将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);
});
在一些猫鼬合作者的帮助下,我发现问题在于我同时使用了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
});
编辑:
我发现您还可以使用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
对象中,然后返回更新文档,但不幸的是,现在这在 Mongoose 中似乎是不可能的。我问过这个问题,在这个 github 问题中可能会有进一步的讨论。目前,这是我选择的解决方案,使用具有计算键值的更新:
// 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); });
猫鼬更新函数不会返回更新的文档。此外,使用 update 函数所做的更改是单独的异步操作,不应与更新函数结合使用。
- 首先查询文档
- 通过为各个键分配新值来修改文档
-
保存并返回更新的文档
docs.findById(id,(err,myDocument(=> { 选择要更改的文档 myDocument.foo =//更新的内容 myDocument.save((err,newDocument(=> { 返回新文档 }) })