【问题标题】:Cast error while executing a mongoose query执行猫鼬查询时出现转换错误
【发布时间】:2018-06-15 00:31:19
【问题描述】:

我正在 mongoose 中执行一个查询,我需要在其中找到我的数据库中的所有用户并对它们进行排序并将结果限制为 10。 我的查询路线是:(路线是“/user/top”)

router.get('/top', middleware.ensureAuthenticated, function (req, res) {
User.find({}).sort({bestScore: 1}).limit(10).exec(function (err, result) {
    if(err){
        res.json({
            status:"error",
            data:err
        });
    }
    else {
        res.json({
            status:"ok",
            data: result
        })
    }
})
});

我的用户模型:

var UserSchema = new mongoose.Schema({
image: String,
displayName: String,
bestScore:Number,
});

当我从邮递员调用 url 时出错

编辑 1:

mongodb查询的输出:

你可以看到我的 _id 是 ObjectId 类型的。

【问题讨论】:

  • 您可能在集合中存储了 _id 不是 ObjectId 的文档
  • 但是当我在终端中运行相同的命令时,它会被执行。
  • shell 不在乎 _id 是什么类型,mongoose 会 - 因为你的架构 - 因为它没有明确声明它被假定为 ObjectId 类型。
  • 我还能做些什么吗?我想让猫鼬把它保存为 ObjectId 。

标签: node.js mongodb mongoose


【解决方案1】:

您遇到的问题是您的搜索路线正在通过 findbyId。如果您真的想在不使用 ID 的情况下搜索/查找所有用户,则需要确保在您的控制器中,您的搜索位于您的 getbyId 之前。你的路线也一样。我遇到了同样的错误here,我可以通过将搜索功能放在 getbyId 之前从我的路线解决它。

另外,当您使用邮递员时,请输入搜索参数,如下面我自己的案例研究所示; 记下路径和我的参数键和值:

【讨论】:

    【解决方案2】:

    您的数据可能包含如下所示的文档:

    {
        _id: "top",
        ...
    }
    

    由于默认情况下 Mongoose 期望该值是 ObjectId,因此您会收到此错误。您可以做的是将_id 字段显式映射为string

    var UserSchema = new mongoose.Schema({
        _id: String,
        image: String,
        displayName: String,
        bestScore:Number,
    });
    

    【讨论】:

    • _id是mongoose创建条目时默认生成的字段
    • 是的,但它会生成一个 ObjectId 而不是您的数据似乎包含的字符串值。
    • 我还能做些什么吗?我想让猫鼬把它保存为 ObjectId 。
    • 是的,但是您需要更改现有数据以使 Mongoose 能够在不更改映射的情况下理解它。当您保存文档时 - 您的问题中缺少该代码 - 您应该确保不要将“top”或任何内容保存为“_id”值,而是保存一个有效的 ObjectId。
    • 我不是那样存钱的。 _id 由 mongoose 自动分配
    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2012-02-22
    • 2012-02-02
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多