Mongoose更新文档时甚至不运行save()函数

Mongoose更新文档时甚至不运行save()函数,mongoose,document,updating,Mongoose,Document,Updating,我在用快车。 在从Api发送响应之前,我在MongoDb中有文件路径。 我正在用文件路径预加api Url 像 但是它也更新了mongodb中的路径,即使我没有保存这个文档,我也只是发送响应 const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating"); song.lastPlayed = true; song.save(); res.send({ ...song, path: url + song.p

我在用快车。 在从Api发送响应之前,我在MongoDb中有文件路径。 我正在用文件路径预加api Url 像

但是它也更新了mongodb中的路径,即使我没有保存这个文档,我也只是发送响应

const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
song.lastPlayed = true;
song.save();
res.send({ ...song, path: url + song.path });
我试过了

const newSong = song;
newSong.path = url + newSong.path;
res.send(newSong)
)

但这并没有帮助,文档仍在更新中

这是我的控制器

    const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
    song.lastPlayed = true;
    song.save();
    song.path = url + song.path;
    res.send(song);
它应该只更新响应的属性。。不在数据库中

更新


如果我注释掉
song.save()
路径不会得到更新

发生的事情是,
doc.save()
是异步的,当您改变对象并发送响应时,
doc.save()
仅在主线程之后执行,这就是为什么
song.path=url+song.path将副本获取到mongoDB,即使您认为以前保存过它

您可以仅为响应创建一个新对象

const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
song.lastPlayed = true;
song.save();
res.send({ ...song, path: url + song.path });
或者您可以
等待
保存,然后为响应修改对象,如果您想在发送响应之前处理错误,这是很好的

const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
song.lastPlayed = true;
await song.save();
song.path = url + song.path;
res.send(song);

歌曲是模型的一个实例,如果您要保存它,因为它包含所有必需的字段,包括change和id,它将更新它。如果只想更改响应,请不要在此处进行保存呼叫。