您好我想知道您是否可以帮助我动态构建方法链,我怀疑如果您知道如何轻松完成...
使用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方法,将会有一个项目数组,该数组中的每个项目都需要一个新的填充方法添加到链中。
最后,我需要一个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);
});
},
}
答案 0 :(得分: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){...});