繁体   English   中英

如何在猫鼬中扩展查询对象

[英]How to extend Query object in mongoose

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

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

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

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

然后你可以调用这个方法作为链的最后一个。

干杯,

马科斯。

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

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

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

扩展 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 });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM