我在和羽毛兽和mongoose 合作.

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

但是,当我在"status"字段中添加$inc时,它不关心枚举,我可以根据需要多次添加$inc,并将状态设置为100000.

我不知道是因为羽毛还是别的原因

谢谢

推荐答案

这是文件中规定的"按预期工作":

enum:Array,创建一个验证器,用于判断该值是否严格等于给定数组中的一个值.

enum只创建了一个mongoose验证程序,is:

验证是中间件.默认情况下,Mongoose将验证注册 for each 模式上的pre('save')钩子.

理论上,你应该用他们的update validators来做这个,但是他们不支持$inc,而且他们的行为有时也不太清楚.

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


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

  1. 最简单的解决方案是只在代码中执行,首先找到对象,如果它符合标准,然后执行$inc,显然这不会给出实际的验证,并且只在您要实现它的地方受支持,如果您在代码中有许多地方可以进行这样的更新,这也不是最优的.

  2. 使用mongodb validation,这是"真正的"验证,实际上在db级别进行验证.例如,您可以创建自己的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',
});

现在,任何具有无效值的更新都将失败.

Mongodb相关问答推荐

为什么AllowDiskUse不能在$GROUP阶段的聚合管道中工作?

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

使用特定关键字和邻近度进行查询和过滤

MongoDB 聚合 - 条件 $lookup 取决于字段是否存在

Mongoose - $project 嵌套的对象数组到数组的根级别

Mongodb聚合查找连接两个对象字段的集合数组匹配对象索引字段的总和

mongoDB 过滤、排序和排名结果

MongoDB聚合 - 用另一个数组过滤数组

聚合/元素子文档作为 mongo 中的顶级文档

将 MongoDB 地理空间索引与 3d 数据结合使用

获取收集字节使用情况统计信息的pymongo方法?

在mongodb中实现分页

Mongo DB中的Upserting和Id问题

从 LinkedHashMap 转换为 Json 字符串

Node + Mongoose:获取最后插入的 ID?

使用 Spring Security + Spring 数据 + MongoDB 进行身份验证

Mongodb错误:The positional operator did not find the match needed from the query

Mongodb 按字段名称查找任何值

未找到 MongoDB 数据/数据库

MongoDb:聚合 $lookup 过滤外部文档