带有枚举验证的 Mongoose $inc 失败

Mongoose $inc with enum validation failed

我正在使用 featherJs 和 mongoose。 我有一个带有枚举的模式,我想要 $inc.

new Schema({
    status: { type: Number, enum: [0, 1, 2, 3], default: 0 },
});

但是当我 $inc 'status' 字段时,它不关心枚举,我可以根据需要多次 $inc 并获得 100000 的状态。

不知道是featherjs的原因还是别的什么

谢谢

这是“按预期工作”,如文档中所述:

enum: Array, creates a validator that checks if the value is strictly equal to one of the values in the given array.

所以 enum 只是创建了一个 mongoose 验证器,即 is:

Validation is middleware. Mongoose registers validation as a pre('save') hook on every schema by default.

理论上你应该为此使用他们的update validators,但是他们不支持$inc,而且他们的行为有时不是很清楚。

我个人建议根本不要使用 mongoose,它是一个黑盒子,只会增加错误和混乱。特别是当涉及到他们的“验证器”时,它们不是“真正的”验证器。


那么你能做些什么来解决这个问题?

  1. 最简单的解决办法就是在代码中做,先找到object,如果符合条件才做$inc,显然这不给实际验证,并且仅在您实施它的地方受支持,如果您在代码中有很多地方可以进行此类更新,这也不是最佳选择。

  2. 使用mongodbvalidation,这是在数据库级别实际验证的“真实”验证。例如,您可以创建 collection:

db.createCollection('collection_name', {
    validator: {
        $jsonSchema: {
            bsonType: 'object',
            properties: {
                status: {
                    bsonType: 'int',
                    enum: [0, 1, 2, 3],
                    description: 'must be a valid status integer',
                },
            },
        },
    },
    validationAction: 'error',
});

现在任何具有 none 有效值的更新都将失败。