1

我正在尝试向名为“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.");
  }
};
4

3 回答 3

3

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

创建了一个 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.");
  }
};

并且只在需要的地方需要它(在这种情况下在我的模型中)。

然后您可以将此方法称为链的最后一个。

干杯,

马科斯。

于 2012-07-16T16:44:17.163 回答
0

也许你可以使用这个模块或者看看他们是如何实现的:mongoose-paginate

另一种解决方案是为您的架构创建一个方法,如下所示:

Schema.statics.paginate = (page, limit, cb) ->
   ...
  return query;
// or
Schema.statics.paginate = (query, page, limit, cb) ->
   ...
  return query.exec();
于 2012-07-13T09:13:55.427 回答
0

扩展 Mongoose 模式的 API 是plugin(). 定义一个简单的插件函数,如下所示:

function paginatePlugin(schema) {
  schema.query.paginate = function({ start, limit = 10 }) {
    return this.skip(start).limit(limit);
  };
}

然后将其注入您的模型中,例如:

fooSchema.plugin(paginatePlugin);

然后使用它:

await Foo.find().paginate({ start: 10, limit: 100 });

这也允许您编写查询扩展:

await Foo
  .find()
  .where({ bar: { $gt: 1 } })
  .sort({ bar: 1 })
  .paginate({ start: 10, limit: 100 });
于 2022-01-04T19:35:40.157 回答