【问题标题】:MongoDB upsert creates another instanceMongoDB upsert 创建另一个实例
【发布时间】: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 嘿!你的解决方案奏效了!如果您愿意提供答案并解释它,我将非常乐意接受它作为经过验证/接受的答案。非常感谢!

标签: node.js mongodb


【解决方案1】:

基于@Ashwanth Madhav 信息的可能解决方案/解释:

在您的代码中,“id”作为 String 类型发送到更新,但 MongoDB 中的 id 是 ObjectId 类型:

代码会是这样的:

var id;
 if(req.params._id  == 'undefined'){
    // 'id' NEED TO BE AN ObjectId...
    // 'id' WAS BEING SENT AS A 'String'
    id = ObjectId(crypto.randomBytes(12).toString('hex'));
 } 

 else {
    id = ObjectId(req.params._id)
 }

【讨论】:

  • 已批准。感谢您的回答,希望对社区有所帮助。
猜你喜欢
  • 2016-06-24
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多