我想在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中实现它?如果是,我的申请有什么问题?
3条答案
按热度按时间pbossiut1#
$cond
是一个聚合运算符,不能在简单的更新查询中使用。如果您试图更新单个字段,我会建议一种简单的方法
你可以在查询部分检查条件,如果
deviceId
为空,则更新新的deviceId
,否则将忽略更新操作,其次,根据您的尝试,您可以从MongoDB 4.2开始通过update with aggregation pipeline实现,
f2uvfpb92#
不,您不能在更新中使用
$cond
,MongoDB不允许这样做。但你仍然可以通过使用这种方式来实现这一点:MongoDB更新条件
daolsyd03#
使用
CollectionName.findByIdAndUpdate()
,它对我有用。注意:将选项
new
设置为true
,以获取新版本的文档