猫鼬中的findById对于特定模式返回null

时间:2020-05-22 17:55:56

标签: javascript node.js database mongodb mongoose

我有一个名为subcategory的架构:

const subCategorySchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: false
    },
    category: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Category',
        required: true
    },
    image: {
        type: String,
        required: false
    }
})

但是执行此操作时:const subCategoryRecord = await this.subCategoryModel.findById("idAsString")我得到空

我读到了诸如this之类的其他问题 (在这里说我应该发送new ObjectId('id')而不是string

但是我还有一个称为category的模式,在通过发送字符串进行findById的过程中我得到了结果,有什么区别?

这是类别架构:

const categorySchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: false
    },
    image: {
        type: String,
        required: false
    }
})

此作品:const category = await this.categoryModel.findById('categoryIdAsString')

2 个答案:

答案 0 :(得分:0)

由于您尚未在_id中指定Schema字段,因此其类型为ObjectId。对于findById,您可以将id作为String传递,猫鼬会将其转换为ObjectId进行查询。

由于您收到null响应(没有强制转换错误),我认为您正在向查询传递有效的ObjectId字符串,并且可能没有任何记录与提供的id相匹配

您可以使用以下方法检查您是否传递了有效的id

mongoose.isValidObjectId(idAsString)

答案 1 :(得分:0)

即使使用“ type of”测试,_id也是一个对象,但它会说这是一个字符串。 就我而言,这适用于模型:

authorId: { type: mongoose.Schema.Types.ObjectId, ref: "users" }

如果您需要将_id与保存为字符串的id进行比较,也可以使用.equals()来返回布尔值:

user.userId.equals(checkUser._id)