猫鼬保存()返回旧版本,而不是文档的保存版本



>我一定错过了什么,但我的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 函数所做的更改是单独的异步操作,不应与更新函数结合使用。

  1. 首先查询文档
  2. 通过为各个键分配新值来修改文档
  3. 保存并返回更新的文档

    docs.findById(id,(err,myDocument(=> { 选择要更改的文档 myDocument.foo =//更新的内容 myDocument.save((err,newDocument(=> { 返回新文档 }) })

相关内容

  • 没有找到相关文章

最新更新