Jag*_*gar 3 mongoose mongodb node.js
我想根据其先前的值更新 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)
}
})
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误(我相信这表明我的语法不正确):
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)
Run Code Online (Sandbox Code Playgroud)
我搜索并看到许多使用聚合的应用程序,但是是否可以使用我的updateOne猫鼬方法来实现它?如果是,我的申请有什么问题?
这$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)
}
}
);
Run Code Online (Sandbox Code Playgroud)
其次,根据您的尝试,您可以通过从 MongoDB 4.2 开始更新聚合管道来实现,
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)
}
}
)
Run Code Online (Sandbox Code Playgroud)