【问题标题】:Chaining static constructor in Mongoose ? Like scope in Rails?在 Mongoose 中链接静态构造函数?像 Rails 中的范围?
【发布时间】:2016-06-22 04:46:24
【问题描述】:

有没有办法在猫鼬中链接静态构造函数?

在 Rails 中它是链接 named_scopes 的方式

我有一个特殊的查询来从 mongo 检索一些数据,但有时我必须应用限制或计算它们。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    [更新]此功能has been removed

    Mongoose 已命名范围功能,但有 an unresolved issue 可能表明它们无法正常工作;检查该功能,看看它是否适合您。 (如果有机会,我也会这样做,因为这是一个非常好的功能!)

    以下示例代码取自 https://github.com/LearnBoost/mongoose/blob/master/test/namedscope.test.js 的命名范围测试。

    var UserNSSchema = new Schema({
        age: Number
      , gender: String
      , lastLogin: Date
    });
    
    UserNSSchema.namedScope('olderThan', function (age) {
      return this.where('age').gt(age);
    });
    
    UserNSSchema.namedScope('youngerThan', function (age) {
      return this.where('age').lt(age);
    });
    
    UserNSSchema.namedScope('twenties').olderThan(19).youngerThan(30);
    
    UserNSSchema.namedScope('male').where('gender', 'male');
    
    UserNSSchema.namedScope('female').where('gender', 'female');
    
    UserNSSchema.namedScope('active', function () {
      return this.where('lastLogin').gte(+new Date - _24hours)
    });
    
    mongoose.model('UserNS', UserNSSchema);
    
    UserNS.olderThan(20).find(function (err, found) { ... });
    UserNS.olderThan(40).active.male.find(function (err, found) { ... });
    

    【讨论】:

      【解决方案2】:

      只需扩展 Mongoose Query 对象,您就可以链接您的方法。像这样

      mongoose.Query.prototype.customPopulate = function(populate) { var查询=这个; 变种模型 = this.model; 如果(填充!= null) { 返回查询.填充(填充); } 别的{ 返回查询; } }

      【讨论】:

        【解决方案3】:

        这是一个老问题,但我创建了一个小插件来解决这个问题:

        https://github.com/gberger/mongoose-named-scopes

        https://www.npmjs.com/package/mongoose-named-scopes

        UserSchema.scope('olderThan', function (age) {
          return this.where('age').gt(age);
        });
        
        UserSchema.scope('youngerThan', function (age) {
          return this.where('age').lt(age);
        });
        
        UserSchema.scope('twenties', function() {
          return this.olderThan(19).youngerThan(30);
        });
        
        UserSchema.scope('male', function() {
          return this.where('gender', 'male');
        });
        
        
        User.male().twenties().then(...)
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 2011-05-06
        • 2020-05-05
        • 2023-03-29
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        相关资源
        最近更新 更多