Mongoose 在架构级别排除文档结果

Posted

技术标签:

【中文标题】Mongoose 在架构级别排除文档结果【英文标题】:Mongoose Exclude document results at schema level 【发布时间】:2021-03-09 16:44:18 【问题描述】:

我正在为我的用户创建一个模型。每个用户都有一个属性isVerified,它是一个布尔值。我希望能够在 mongoose 模型上调用 Model.find 并排除所有带有 isVerified === false 的文档,而不必在查询期间指定它。 我想在架构中设置它,以便每当调用 Model.find 时,这些文档都会被自动排除。任何帮助表示赞赏

用户模型:

const UserSchema:Schema = new Schema(
    name: 
        type: String,
        required: true,
        trim: true,
    ,
    email: 
        type: String,
        required: true,
        unique: true,
        lowercase: true,
        trim: true,
        index: true,
        validate: 
            validator: (value:string) => validator.isEmail(value),
            message: (props:any) => "Invalid Email Address"
        ,
    ,
    password: 
        type: String,
        trim: true,
        required: true,
        select: false,
        minlength: 6,
        validate: 
            validator: (value:string) => !validator.contains(value, "password"),
            message: (props:any) => "Your password cannot contain the word 'password'"
        
    ,
    phoneNumber: 
        type: String,
        trim: true,
        required: true,
        validate: 
            validator: (value:string) => validator.isMobilePhone(value, 'any', strictMode: true),
            message: (props:any) => "Please include country code (e.g. +233 for Ghana +44 for the United Kingdom) to phone number"
        
    ,
    isActive: 
        type: Boolean,
        default: false
    
    ,
    tokens: [
        
            token: 
                type: String,
                required: true
            
        
    ]
,
    strict: "throw",
    timestamps: true
)

编辑:

我做了一些挖掘,看来我可以覆盖基本方法来重新实现返回的查询。我试图这样做如下所示:

UserSchema.statics.find = function () 
    let query = UserModel.find.apply(this, arguments);
    query.where('isActive').ne(false)
    return query;

但是我得到以下错误

 RangeError: Maximum call stack size exceeded

【问题讨论】:

【参考方案1】:

终于想通了。需要将更改应用到 Model 对象而不是实例 UserModel,如下所示:

UserSchema.statics.find = function () 
    let query = Model.find.apply(this, arguments);
    query.where('isActive').ne(false)
    return query;

现在 find 方法会跳过非活动用户

【讨论】:

以上是关于Mongoose 在架构级别排除文档结果的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Mongo(mongoose)中的点符号搜索子文档 [重复]

根据另一个字段值 mongodb mongoose 从文档中排除字段

Mongo/Mongoose Invalid atomic update value 错误

mongo+mongoose+express

保存异常的 Mongo 文档

Mongoose 不尊重模式并插入错误的数据类型