【发布时间】:2021-05-10 19:47:25
【问题描述】:
我正在使用 Mongoose 5.12.7 和 mongo 4.4.5,我正在尝试更新对象中的总点数,它应该是简单点、中等点、困难点和极限点的总和。
This is currently how it looks like
这是更新查询:
maths_results.updateOne({ "Id":_id},{$set: {"totalPoints":[{$sum:["$easy.points","$medium.points","$hard.points","$extreme.points"]}]}})
这是 Mongoose 架构:
const Maths_results_schema = new mongoose.Schema({
Id:{type:String,
required:true},
userName:{type:String,
required:true},
totalPoints:Number,
easy:{points:Number,
speed:Number,testsTaken:[
{Time:Number,
correct:Number,
date:{type:Date,
default:Date.now}
}]},
medium:{points:Number,
speed:Number,testsTaken:[
{Time:Number,
correct:Number,
date:{type:Date,
default:Date.now}
}]},
hard:{points:Number,
speed:Number,testsTaken:[
{Time:Number,
correct:Number,
date:{type:Date,
default:Date.now}
}]},
extreme:{points:Number,
speed:Number,testsTaken:[
{Time:Number,
correct:Number,
date:{type:Date,
default:Date.now}
}]}})
虽然我得到一个错误:
CastError: Cast to Number failed for value "[
{
'$sum': [
'$easy.points',
'$medium.points',
'$hard.points',
'$extreme.points'
]
}
]" at path "totalPoints"
at model.Query.exec
at model.Query.Query.then
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
messageFormat: undefined,
stringValue: '"[\n' +
' {\n' +
" '$sum': [\n" +
" '$easy.points',\n" +
" '$medium.points',\n" +
" '$hard.points',\n" +
" '$extreme.points'\n" +
' ]\n' +
' }\n' +
']"',
kind: 'Number',
value: [ { '$sum': [Array] } ],
path: 'totalPoints',
reason: AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value
【问题讨论】:
-
常规更新查询不允许内部字段作为另一个内部字段的输入/值,您可以从 MongoDB 4.2 开始尝试update with aggregation pipeline
-
在 Mongo shell 中,查询成功,所以它看起来真的像猫鼬问题?
-
不可能在 shell 或任何地方工作这个查询,没有它不是猫鼬错误。语法错误,它不支持内部字段。
-
非常感谢!我发现我错过了 $set 之前的“[”
-
是的,我在第一条评论中提到了你,它被称为使用聚合管道更新。
标签: node.js mongodb mongoose mongoose-schema