【问题标题】:How to use $cond in updateOne using mongoose?如何使用 mongoose 在 updateOne 中使用 $cond?
【发布时间】:2021-07-05 18:13:48
【问题描述】:

我想根据之前的值更新mongodb中的一个值,如果null(保存为字符串)那么我会将它更新为一个新值,否则我想保持原样。
这是我的代码:

User.updateOne({_id: user._id}, {$set: {
                        deviceId: {$cond: [{$eq: ['null']}, req.body.deviceId, 'null']}
                    }}, null, function (err, res){
                    if (err){
                        return done(err)
                    }else{
                        return done(null, user)
                    }
                })

但我得到以下错误(我相信这表明我的语法不正确):

CastError: Cast to string failed for value "{ '$cond': [ { '$eq': [Array] }, 'MYDEVICEID', 'null' ] }" (type Object) at path "deviceId"
    at model.Query.exec (D:\X_APP\XAPP_BACKEND\node_modules\mongoose\lib\query.js:4478:21)
    at _update (D:\X_APP\XAPP_BACKEND\node_modules\mongoose\lib\query.js:4330:11)
    at model.Query.Query.updateOne (D:\X_APP\XAPP_BACKEND\node_modules\mongoose\lib\query.js:4229:10)
    at _update (D:\X_APP\XAPP_BACKEND\node_modules\mongoose\lib\model.js:3834:16)
    at Function.updateOne (D:\X_APP\XAPP_BACKEND\node_modules\mongoose\lib\model.js:3770:10)
    at file:///D:/X_APP/XAPP_BACKEND/middlewares/userMiddleware.js:24:32
    at processTicksAndRejections (internal/process/task_queues.js:95:5)

我搜索并看到了许多使用聚合的应用程序,但是否可以使用我的方法 updateOne 在猫鼬中实现它?如果是,我的申请有什么问题?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    $cond 是一个聚合运算符,您不能在简单的更新查询中使用,

    如果为 null(保存为字符串),那么我会将其更新为新值,否则我想保持原样。

    如果您尝试更新单个字段,我会建议一种简单的方法,

    如果deviceId为null,则可以检查查询部分的条件,然后更新新的deviceId,否则将忽略更新操作,

    await User.updateOne(
      { 
        _id: user._id,
        deviceId: "null"
      }, 
      {
        $set: {
          deviceId: req.body.deviceId
        }
      }, 
      null, 
      function (err, res){
        if (err){
          return done(err)
        }else{
          return done(null, user)
        }
      }
    );
    

    其次,根据您的尝试,您可以从 MongoDB 4.2 开始通过update with aggregation pipeline 实现,

    await User.updateOne(
      { _id: user._id }, 
      [{
        $set: {
          deviceId: {
            $cond: [
              { $eq: ["$deviceId", "null"] },
              req.body.deviceId,
              "null" // or you can use "$deviceId"
            ]
          }
        }
      }], 
      null, 
      function (err, res){
        if (err){
          return done(err)
        }else{
          return done(null, user)
        }
      }
    )
    

    【讨论】:

    • 谢谢,这种方法对我来说更好,即使我需要更新多个不同条件的字段。
    • 我已经添加了第二种方法以及根据您的需要。
    【解决方案2】:

    不,您不能在更新中使用$cond,MongoDB 不允许这样做。

    但是你仍然可以通过这种方式实现这一点:MongoDB update with condition

    【讨论】:

    • 我刚刚看到collection.update()在猫鼬中被弃用了,那么还有其他方法可以实现吗?
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2022-08-14
    • 2021-01-24
    相关资源
    最近更新 更多