1

「paginate」というQueryオブジェクトにチェーンメソッドを追加しようとしています。query.jsに追加すれば、問題なく使用できます。ただし、コアファイルの1つを変更することはお勧めできません。

いくつかの変更を加えて見つけたこのコードを使用しており、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

たぶん、あなたはこのモジュールを使うか、彼らがそれをどのように達成するかを見ることができます:マングース-パギネート

別の解決策は、次のようなスキーマへのメソッドを作成することです。

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 に答える