如何在mongoose中扩展Query对象

时间:2012-07-13 00:20:41

标签: javascript node.js prototype mongoose

我试图将一个链方法添加到名为“paginate”的Query对象中。如果我将它添加到query.js我可以毫无问题地使用它。但是,修改其中一个核心文件并不是一个好主意。

我正在使用我发现的这些代码进行了一些修改,并希望它成为Query原型的一部分,但我没有取得任何成功,使它在Query.js之外运行。

我怎样才能做到这一点?有没有关于如何通过模块扩展这些核心文件的文档?我找不到任何适合我的东西。

mongoose.Query.prototype.paginate = function(page, limit, cb) {
  var model, query, skipFrom;
  if (page == null) {
    page = 1;
  }
  if (limit == null) {
    limit = 10;
  }
  query = this;
  model = this.model;
  skipFrom = (page * limit) - limit;
  query = query.skip(skipFrom).limit(limit);
  if (cb) {
    return query.run(function(err, docs) {
      if (err) {
        return cb(err, null, null);
      } else {
        return model.count(query._conditions, function(err, total) {
          return cb(null, total, docs);
        });
      }
    });
  } else {
    throw new Error("pagination needs a callback as the third argument.");
  }
};

2 个答案:

答案 0 :(得分:2)

事实证明它比我预期的容易得多。这就是我所做的并且有效:

使用以下命令创建了一个paginate.js文件:

mongoose = require('mongoose');

mongoose.Query.prototype.paginate = function(aPageStart, aLimit, aCallback) {
  var model, query;

  if (aLimit == null) {
    aLimit = 10;
  }
  query = this;
  model = this.model;
  query = query.skip(aPageStart).limit(aLimit);
  if (aCallback) {
    return query.run(function(aError, aDocs) {
      if (aError) {
        return aCallback(aError, null, null);
      } else {
        return model.count(query._conditions, function(aError, aTotal) {
          return aCallback(null, aTotal, aDocs);
        });
      }
    });
  } else {
    throw new Error("pagination needs a callback as the third argument.");
  }
};

并且只需要它(在我的模型中)。

然后你可以将这个方法称为链的最后一个。

干杯,

马科斯。

答案 1 :(得分:0)

也许您可以使用此模块或查看它们是如何实现的:mongoose-paginate

另一个解决方案是为您的架构创建一个方法:

Schema.statics.paginate = (page, limit, cb) ->
   ...
  return query;
// or
Schema.statics.paginate = (query, page, limit, cb) ->
   ...
  return query.exec();