在Mongoose中链接静态构造函数?像Rails中的范围一样?

时间:2012-08-08 11:34:36

标签: node.js mongodb express mongoose

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

在Rails中链接named_scopes的方式

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

3 个答案:

答案 0 :(得分: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) { ... });

答案 1 :(得分:0)

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


    mongoose.Query.prototype.customPopulate = function(populate) {
    var query = this;
    var model = this.model;

    if(populate != null)
    {
    return query.populate(populate);
    } else{
        return query;
    }
    }

答案 2 :(得分:0)

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

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(...)