据我所知,使用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"},
,最后一个字符不同。
为什么我希望在数据库中只有一个条目,却为什么创建了更多相同数据的条目?
Mongo在创建每个集合时会自动在每个集合上创建一个名为default index的_id
。如果在未指定_id
的情况下将文档插入集合中,它将生成一个新的ObjectId
作为_id
字段。
要解决此问题,您可以将findOneAndUpdate
与findOneAndUpdate
结合使用:
upsert
但是,如果文档已经存在,它将更新文档,而不是创建一个新文档。如果您还希望根本不更改文档,则可以用Entry.findOneAndUpdate({ entry_id: req.params.entry_id }, { <content> }, { upsert: true })
包围<content>
。