1

こんにちは、メソッドチェーンを動的に構築するのを手伝ってもらえないかと思いました.方法を知っていれば、これは簡単にできると思います...

mongoose と node.js を使用して、mongo データベースにクエリを実行しています。次のようなオブジェクトを渡す関数を使用します。

transaction = {
       model: a mongoose model
       req: Express.js request object
       res: Express.js response object
       query: a mongo db query eg, {_id:xxxxx}
       populate: [ {
         field: 'name_of_doc_field'
         select: 'field1,field2'
       } ]
    }

クエリを動的に構築していますが、関数内で入力する必要があるフィールドの数や、オフセットまたは制限が必要かどうかがわかりません。

検索結果を連鎖させたい:

transaction.model.find(transaction.query).skip(offset).limit(limit).exec(function(err, collection_obj){...})

このチェーンを動的に構築するにはどうすればよいですか。テスト オブジェクトでオフセットが指定されているかどうか、チェーンに .skip メソッドを追加するかどうかなどをテストする必要があります。populate メソッドを使用すると、アイテムの配列が作成されます。 、その配列の各項目には、チェーンに追加する新しい populate メソッドが必要です。

最後に、チェーンの最後に exec メソッドを追加する必要があります。

事前にご協力いただきありがとうございます

// Generated by CoffeeScript 1.4.0
    module.exports = {
      findMany: function(transaction) {
        var collection_obj, limit, offset;
        offset = parseInt(transaction.req.query.offset) || 0;
        limit = parseInt(transaction.req.query.limit) || 100;
        collection_obj = null;
        return transaction.model.find(transaction.query).skip(offset).limit(limit).exec(function(err, collection_obj) {
          return found(err, collection_obj, transaction.req, transaction.res);
        });
      },
    }
4

1 に答える 1

2

の内容に基づいて条件付きで実行できるステップにチェーンを分割できますtransaction

var q = transaction.model.find(transaction.query);
if (offset) {
  q = q.skip(offset);
}
if (limit) {
  q = q.limit(limit);
}
if (transaction.populate) {
  transaction.populate.forEach(function(pop) {
     q = q.populate(pop.field, pop.select);
  });
}
q.exec(function(err, collection_obj){...});
于 2013-02-19T13:22:38.493 に答える