【问题标题】:Mongoose auto-increment fails because of a cast error由于强制转换错误,Mongoose 自动增量失败
【发布时间】:2022-12-21 12:30:59
【问题描述】:

我正在尝试增加一个简单的数字字段,但它告诉我它无法转换为错误。

CastError: Cast to Number failed for value "{ '$inc': 1 }" (type Object) at path "times_dealt"

说它是一个对象?

这是我对Answer 的架构

const answerSchema = new mongoose.Schema({
    body: {
        type: String,
        trim: true,
        required: true,
    },

    times_dealt: {
        type: Number,
        required: true,
    },
    times_picked: {
        type: Number,
        required: true,
    },
    times_won: {
        type: Number,
        required: true,
    },
}, {
    timestamps: true,
});

module.exports = { answerSchema };

这是我让管理员添加新答案的途径(这是一个游戏,所以只有我可以添加它们,这就是授权的原因。我想我会包含完整的代码。)

router.post("/answers", async(req, res) => {
    try {
        const isMatch = await bcrypt.compare(
            req.body.password,
            process.env.ADMIN_PASSWORD
        );

        if (isMatch) {
            const answer = new Answer({
                body: req.body.answer.trim(),
                times_dealt: 0,
                times_picked: 0,
                times_won: 0,
            });
            await answer.save();

            res.status(201).send(answer);
        }
        res.status(401).send();
    } catch (e) {
        console.log("failed to save", e);
        res.status(400).send(e);
    }
});

然后每当发牌时,我想增加 times_dealt 的计数,这就是我收到错误的时候。我是这样做的:

async function getOneAnswerCard(room) {
    if (room.unused_answer_cards.length !== 0) {
        // We pick a random answer's ID from our array of unused answers
        const randomAnswerID = getRandomElement(room.unused_answer_cards);

        // We get that answer's full object from our DB
        const newAnswer = await Answer.findById(randomAnswerID);

        // const newAnswer = await Answer.findByIdAndUpdate(randomAnswerID, {
        //     times_dealt: { $inc: 1 },
        // });
        await Answer.findByIdAndUpdate(randomAnswerID, {
            times_dealt: { $inc: 1 },
        });

        // We remove it from the unused cards array
        room.unused_answer_cards = room.unused_answer_cards.filter(
            (answerID) => answerID !== randomAnswerID
        );

        // We add it to the dealt cards array
        room.dealt_answer_cards.push(randomAnswerID);

        // We serialize the answer (we don't want the user to get info on our answer stats)
        const serializedAnswer = { _id: newAnswer._id, body: newAnswer.body };

        return serializedAnswer;
    }
}

自己得到答案是没有问题的。获取随机 ID 并获取答案对象就可以了。只有当我添加了它开始崩溃的增量功能时。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我认为您使用的 $inc 语法错误。试试这个:

    await Answer.findByIdAndUpdate(randomAnswerID, {
      { $inc: { times_dealt: 1 } },
    });
    

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 2012-04-23
      • 1970-01-01
      • 2018-07-12
      • 2020-12-16
      • 2022-08-15
      • 2012-09-01
      • 2014-06-15
      • 1970-01-01
      相关资源
      最近更新 更多