如何使用mongoose在updateOne中使用$cond?

ikfrs5lh  于 2023-05-13  发布在  Go
关注(0)|答案(3)|浏览(418)

我想在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在mongoose中实现它?如果是,我的申请有什么问题?

pbossiut

pbossiut1#

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

  • 如果为null(保存为字符串),则我将更新为新值,否则我希望保持原样。*

如果您试图更新单个字段,我会建议一种简单的方法
你可以在查询部分检查条件,如果deviceId为空,则更新新的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)
    }
  }
)
f2uvfpb9

f2uvfpb92#

不,您不能在更新中使用$cond,MongoDB不允许这样做。
但你仍然可以通过使用这种方式来实现这一点:MongoDB更新条件

daolsyd0

daolsyd03#

使用CollectionName.findByIdAndUpdate(),它对我有用。

router.post('/:id', auth, async (req, res) => {
  
  try {
    /* 👇 Try this approach 👇 */
    const myNewData = req.body;
    await MyCollectionName.findByIdAndUpdate( myNewData._id , {
      email: req.body.email,
      password: req.body.password,
      etc: req.body.etc
    },
    {new: true} 

  } catch (err) {
    res.status(400).json({ message: err.message })
  }

})

注意:将选项new设置为true,以获取新版本的文档

相关问题