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

时间:2018-09-07 20:35:10

标签: javascript database mongodb mongoose

我必须丢失一些东西,但是看来我的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最终是文档的旧版本,而新版本的确保存在数据库中。

3 个答案:

答案 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)

猫鼬更新功能不返回更新后的文档。另外,使用更新功能进行的更改是单独的异步操作,不应与更新功能一起使用。

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

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