猫鼬findOneAndUpdate使用自定义_id投放错误

时间:2018-11-12 12:56:10

标签: node.js mongodb mongoose mongoose-schema

我的Person模式如下:

const schema = new mongoose.Schema({
    _id: Number,
    name: String,
    birthday: Date,
    sex: String
});

schema.pre('findOneAndUpdate', async function (next) {
    try {
        let counter = await Counters.findByIdAndUpdate('person',
            {
                $inc: {
                    value: 1
                }
            },
            { new: true}
        );

        this._update._id = counter.value;

        next();
    }
    catch (err) {
        next(err);
    }
});

问题是,当我尝试用findOneAndUpdateupsert: true添加一些新人员时,它会生成CastError: Cast to ObjectId failed for value "18" at path "person"

我的_id被定义为Number,所以我不明白为什么它试图将其强制转换为ObjectId

更新:

我发现了问题,Person模型在其他模型中被引用,但是我忘记更改其他模型中的ref类型...

person: {
    type: Number, //HERE
    ref: 'person',
    required: true
}

2 个答案:

答案 0 :(得分:0)

您可以更改_id属性的类型,尽管这不是一个好方法,但实际上您无法更改该值,因为它是不可变且代表{{3} }文档的键。请记住,_id对于MongoDB生命周期(如索引编制)非常重要。如果要更改 Entity 键,则可以创建其他属性,例如person_id

答案 1 :(得分:0)

_id是MongoDB的自动生成的属性。如果要添加ID属性的其他名称,例如“ personId”,或者可以使用MongoDB自动生成的ID,而无需创建单独的ID。