【问题标题】:.updateOne on MongoDB not working in Node.jsMongoDB 上的 .updateOne 在 Node.js 中不起作用
【发布时间】:2018-05-19 06:50:34
【问题描述】:

我有以下代码:

connection((db) => {
            db.collection('orders')
                .updateOne(
                    { "_id": req.body._id}, // Filter
                    {"name": req.body.name} // Update
                )
                .then((obj) => {
                    console.log('Updated - ' + obj);
                    res.redirect('orders')
                })
                .catch((err) => {
                    console.log('Error: ' + err);
                })
        })

我想更改订单中的名称,但没有更新。 控制台中的结果是

Updated - {"n":0,"nModified":0,"ok":1}

我试图阅读文档,但它太可怕了

编辑:{$set: {"name": req.body.name}}, 效果不佳

编辑 2:传递的 ID 与数据库中的 _id 匹配。我在数据库中查询纯文本 ID 是否是一个问题,它被称为“ObjectId('5a42ja...')”

【问题讨论】:

  • 文档很好,只是总是寻找“示例”部分:尝试 { db.restaurant.updateOne( { "name" : "Central Perk Cafe" }, { $set: { "violations" : 3 } } ); } 捕捉 (e) { 打印(e); }
  • 嗯,我说的是与 node.js 相关的文档。我不能在那里写这样的查询(或者我可以吗?)
  • 你能分享2 3个mongo文件吗? req.body._id 的值是多少?

标签: javascript node.js mongodb mongodb-query


【解决方案1】:

也许您应该像这样在更新查询中使用“$set”:

{$set: {"name": req.body.name}}, // Update

更多信息在documentation

编辑

如果不起作用,这可能是因为与您的过滤器不匹配。

也许你应该尝试匹配这样的 ObjectId:

var ObjectID = require('mongodb').ObjectID;

// In your request
{ "_id": ObjectID(req.body._id)}, // Filter

希望对你有帮助。

【讨论】:

  • 可能是因为你的过滤器不匹配?您可以尝试查找带有 { "_id": req.body._id} 的文档吗?
  • 嗯 req.body._id 中传入的 ID 和数据库中的 ID 是一样的,但是它是作为字符串传递的,而在数据库中,它是 ObjectId() 类型的。难道是它没有过滤它。因为那个?
【解决方案2】:

使用{$set: {"name": req.body.name}}(如 Sparw 所述)更新文档中所需的属性。此外,如果您作为参数传递的 id 在集合中不存在(并且您想创建一个具有相同 id 的 ID),您可以将其作为第三个参数 {upsert: true} 传递以创建一个。

在你的例子中:

connection((db) => {
          db.collection('orders')
               .updateOne(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

【讨论】:

  • 我无法理解逻辑,但是对于 find 和 updateOne,您应该使用不同的语法来按 id 进行搜索。示例:- db.admins.find({ id: req.params.id, isDeleted: false }) 和 db.admins.updateOne( { _id: new ObjectID(req.params.id), isDeleted: false}。简单的问题- 为什么?
【解决方案3】:

Tough @Spraw 的回答在某些情况下是正确的,但有时它不起作用。我认为方便的答案是updateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback)

mongodb 中的_id 是一个BSON 对象,应该被实例化。

【讨论】:

  • 对我来说似乎是这样,只有在我添加回调函数时才有效。
【解决方案4】:

为时已晚,但对于使用 mongodb 学习 nodejs 的新手或学生来说。而不是updateOne 方法,只需使用update 方法。

connection((db) => {
          db.collection('orders')
               .update(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

【讨论】:

    【解决方案5】:

    对我来说,在更新中传递对象之前,我必须删除“_id”/id 字段。

    否则会说该字段无效。

    显然,在将密钥用作参考时更新密钥并不是最好的做法。

    【讨论】:

      【解决方案6】:

      正确的语法是:

      monDb.collection.updateOne(
          {"_id": ObjectId(req.params.id)}, 
          { $set: updateDoc }, 
          function(err, doc) {
            ...
          }
      );
      

      更新:不是ObjectID,而是ObjectId

      【讨论】:

      • 嘿@victor 感谢您的回答,但请您详细介绍一下。了解 OP 在其语法中实际出错的地方会很有用。
      【解决方案7】:

      我也遇到了这个问题,我用 req.body 中的 _id 创建了一个常量

      const {_id} = req.body  //pass ID user
      await User.updateOne({_id},{$set:data}, (err)=>{
                  if(err) return res.status(200).json({
                      error: true,
                      code: 115,
                      message: "Erro to update user!"
                  })
              })
      

      【讨论】:

        【解决方案8】:

        如果集合架构缺少要更新的字段,则可能会发生这种情况。如果架构不严格(即 isStrict: false),请检查更新运算符。在某些情况下,新的更新值可以与现有值相同。在这种情况下,猫鼬返回

        { n: 1, nModified: 0, ok: 1 }
        

        【讨论】:

          【解决方案9】:

          En NEXT.js

          我的项目在 React 和 Next.js 上。我有这个问题。 我愚蠢的解决方案是 Restart with (next dev) xD

          我在 Schema 模型中添加了两个字段,并尝试更新这些新字段,但直到我重新启动 mi 项目后才起作用。

          我希望为某人节省时间。 :)

          【讨论】:

            猜你喜欢
            • 2020-11-24
            • 2020-02-18
            • 1970-01-01
            • 1970-01-01
            • 2016-09-28
            • 2016-04-03
            • 2019-03-30
            • 2020-08-29
            • 1970-01-01
            相关资源
            最近更新 更多