多次发送相同的PUT请求会在数据库中创建更多条目

问题描述 投票:0回答:1

据我所知,使用PUT可以创建一个资源,如果它不存在,或者它将用新资源替换旧资源。

我想使用Node.js / Express和MongoDB创建资源并能够更新它,而不是创建更多资源。

所以,我写了这段代码:

app.put('/entries/:entry_id/type', (req, res) => {
  const entry = new Entry (req.body);
  entry.save();
  res.end();
})

在邮递员中,有一个PUT请求,其URL为localhost:5000/entries/2/type

发送一次后,它将在dabatase中创建一个条目。都好!

但是让我们尝试再次发送相同的请求。现在数据库中有2个条目。我希望成为一个,因为发送了相同的请求。

在数据库中,它们具有相同的数据,相同的架构,但是它们确实具有一个额外的字段,"_id":{"$oid":"5e8909e60c606c002axxxxxx"},,最后一个字符不同。

为什么我希望在数据库中只有一个条目,却为什么创建了更多相同数据的条目?

node.js mongodb rest mongoose put
1个回答
0
投票

Mongo在创建每个集合时会自动在每个集合上创建一个名为default index_id。如果在未指定_id的情况下将文档插入集合中,它将生成一个新的ObjectId作为_id字段。

要解决此问题,您可以将findOneAndUpdatefindOneAndUpdate结合使用:

upsert

但是,如果文档已经存在,它将更新文档,而不是创建一个新文档。如果您还希望根本不更改文档,则可以用Entry.findOneAndUpdate({ entry_id: req.params.entry_id }, { <content> }, { upsert: true }) 包围<content>

© www.soinside.com 2019 - 2024. All rights reserved.