Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose save()返回文档的旧版本,而不是保存的版本_Javascript_Database_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose save()返回文档的旧版本,而不是保存的版本

Javascript Mongoose save()返回文档的旧版本,而不是保存的版本,javascript,database,mongodb,mongoose,Javascript,Database,Mongodb,Mongoose,我一定遗漏了什么,但我的Document.prototype.save在Mongoose 5.2.10中似乎不能正常工作 回调返回保存的文档 回调将接收两个参数 如果发生错误,则返回err 保存的产品是什么 对我来说,它似乎是在更新和保存之前返回文档的原始版本。要么我做错了什么,要么文件有点误导或模糊 调用save后,数据库中的文档将被更新,但回调将在修改之前返回旧文档 我一直在异步函数中这样调用save: const myDocument = await User.findOne({ name

我一定遗漏了什么,但我的Document.prototype.save在Mongoose 5.2.10中似乎不能正常工作

回调返回保存的文档

回调将接收两个参数

如果发生错误,则返回err 保存的产品是什么 对我来说,它似乎是在更新和保存之前返回文档的原始版本。要么我做错了什么,要么文件有点误导或模糊

调用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最终成为文档的旧版本,而新版本则保存在数据库中。

Mongoose Update函数不会返回更新后的文档。另外,使用update函数所做的更改是一个单独的异步操作,不应与update函数一起使用

首先查询文档 通过为各个键指定新值来修改文档 保存并返回更新后的文档

docs.findByIdid,err,myDocument=>{ //选择要更改的文档 myDocument.foo=//更新的内容 myDocument.saveerr,newDocument=>{ //返回新文档 } }

将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.SetObjectOfUpdateInfo使用更新信息的对象更新一组不同的值,然后获取使用myDocument.save返回的已保存文档的值

因此,我的解决方案是:

myDocument.set(objectOfUpdatedInformation);
myDocument.save().then((savedDoc) => {
    res.json({ response: 'success' savedDoc: savedDoc });
}).catch((err) => { console.log(err); });
下面是我在知道document.protype.save存在之前对情况的初步评估。因为没有彻底阅读文档而给自己带来了额外的痛苦

但是我想用一个对象中的不同字段块来更新我的文档。我希望能够做到这一点,然后得到一个更新的文件。看起来我无法使用myDocument.UpdateObjectofUpdateInfo执行此操作,因为:

.update方法在回调中不提供更新的信息 如果在.update方法之后使用save,则更改不会显示在返回的已保存文档中。 因此,我的选择是:

将更改应用于对象中的各个键/值,然后保存。 重新查询对象并使用Collection.findOneAndUpdate更新它。 Document.save和Collection.findOneAndUpdate都返回更新的文档,但是Document.save与Document.update不兼容,Document.update不返回文档

我希望能够将一个充满更新信息的对象干净地插入到一个已经查询过的myDocument对象中,然后返回更新文档,但不幸的是,现在在Mongoose中这似乎不可能。我问过这件事,可能会有进一步的讨论。目前,这是我选择的使用计算键值更新的解决方案:


我首先查询文档,我只是没有在上面的代码中包含它。现在我已经编辑它来显示。请查看此链接https://davidburgos.blog/return-updated-document-mongoose/Thank 谢谢你的链接。我已经看到了,但实际上我在问一些不同的问题。我不想查询和更新文档,而是想知道如何获取已查询文档的保存版本。这里有一个与猫鼬们进行的很好的讨论:这是可能的,但是对于我的用例来说,如果我能够更新一个我已经看过的文档,并且必须重新找到它并进行更新,那就太好了。这里还有更多的讨论:
// 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); });