【发布时间】:2020-02-25 08:38:20
【问题描述】:
我目前在我的项目中有一个 upsert 函数可以工作,但我的主要问题是它创建了另一个记录实例,并改为更新新实例。这是代码:
router.route('/carousel/update/:_id').put(function(req, res) {
var id;
if(req.params._id == 'undefined'){
id = crypto.randomBytes(12).toString('hex');
}
else {
id = ObjectId(req.params._id)
}
db.collection('home').updateOne({"_id": id},
{$set: req.body}, {upsert: true}, (err, results) => {
if (err) throw err;
res.send(results)
console.log(req.body)
});
});
问题:
1. mongoDB 将我的加密生成 _id 并将其作为更新插入文档的新 _id 让我感到困惑。这是为什么? {upsert: true}时,mongoDB不应该生成一个新的_id吗?
2. 由于问题 1 的性质,每当我尝试更新原始文档时,它都会更新插入的文档,因为它们具有相同的 _id 值,即使它们的 _ids 是位于不同的文档级别。
总之,当给定一个'home' 文档时,如何在不添加具有相同值和_ids 的新记录的情况下正确更新插入?
感谢您的帮助!
编辑
这是文档的 JSON 正文内容,使用加密自定义生成 _id:
{
"_id": "1262d480eea83567181b3206",
"header": "hello",
"subheader": "hello"
}
然而,这是插入文档的正文内容。
{
"_id": {
"$oid": "1262d480eea83567181b3206"
},
"header": "helloasad",
"subheader": "helloasda"
}
正如观察到的,在 upserting 之后,它采用与原始文档相同的 _id 值,但在另一个文档级别。
【问题讨论】:
-
可以分享正文内容吗?
-
我会在我的问题中添加它!
-
@AshwanthMadhav 我已经编辑了我的问题,请随时再次查看 :)
-
检查 id 是否为 objectId。如果不使用
updateOne({"_id": ObjectId(id)} -
@AshwanthMadhav 嘿!你的解决方案奏效了!如果您愿意提供答案并解释它,我将非常乐意接受它作为经过验证/接受的答案。非常感谢!