当使用MongoDB时,我正在进行条件upsert作为聚合过程的一部分,在表单上(简化了很多):
db.dbname.update({attr1 : value1, attr2 : value2},
{"$inc" : { avg : current_value, nr : 1}},
false (multi), true (upsert))
Run Code Online (Sandbox Code Playgroud)
但我希望能够保持最大(和最小)值,而无需检索文档.有点像:
db.dbname.update({ attr1 : value1, attr2 : value2},
{"$inc" : { avg : current_value, nr : 1},
"$setIfBigger" : { max : current_value}},
false (multi), true (upsert))
Run Code Online (Sandbox Code Playgroud)
这有可能以有效的方式实现吗?
我当前的,效率极低的解决方案是我检查当前的聚合文档,如果它存在,我相应地更新值,如果不存在,我创建一个新文档.示例(再次,简化了很多,但实质是那里):
var obj = db.dbname.findOne({attr1 : value1, attr2 : value2},{_id:1});
if (obj != null) {
db.dbname.update({attr1 : value1, attr2 : value2},
{"$inc" : { avg : current_value, nr : 1},
"$set" : …Run Code Online (Sandbox Code Playgroud) 我想根据其先前的值更新 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猫鼬方法来实现它?如果是,我的申请有什么问题?