【问题标题】:Mongoose cast to number failed for value '$sum'值“$sum”的猫鼬转换为数字失败
【发布时间】: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


【解决方案1】:

现在修复了,我错过了 $set 之前的第一个“[”,正确的查询是:

maths_results.updateOne({ "Id":_id},[{$set: {"totalPoints":[{$sum:["$easy.points","$medium.points","$hard.points","$extreme.points"]}]}}])```

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2021-04-21
    • 1970-01-01
    • 2015-11-07
    • 2015-11-16
    • 2021-07-12
    相关资源
    最近更新 更多