2013-02-19 2 views
1

Привет, я задавался вопрос, можете ли вы помочь мне построить метод цепь динамически, я подозреваю, что это легко сделать, если вы знаете, как ...Javascript метода цепочка, добавить методы из массива

Использование мангуста и Node.js I 'm запрашивает базу данных 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){...}) 

Как я построить эту цепь динамически, мне нужно, чтобы проверить смещение ли подавались в тестируемом объекте, если он был добавить Пропусти метод цепочка и т. д., а также с помощью метода заполнения, будет массив элементов, каждый элемент в этом массиве будет нуждаться в новом методе заполнения, добавляющем в цепочку.

Наконец, мне понадобится метод 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); 
     }); 
     }, 
    } 
+1

Вашего API кажется довольно нечетким мне , Вы говорите, что 'transaction.model' является моделью мангуста. У этого уже есть функция 'find', которую вы ищете? Если нет, ожидаете ли вы расширить API-интерфейс mongoose? –

+0

Вы хотите, чтобы методы 'skip',' limit' и 'exec' действовали на' transaction' или на 'model'? – Bergi

+0

Причина, по которой я отделил эту функцию, заключается в том, что я буду повторять эту функцию на многих моделях. Я хочу найти записи в данной модели, которая предоставляется объектом транзакции. Я что-то не понимаю? Он работает так, как он в настоящее время стоит, но не обрабатывает отсутствующие свойства, такие как недостающий «предел» и не запускает метод .populate, потому что я не мог понять, как динамически добавлять изменения для каждого элемента в массив. –

ответ

1

Вы можете разорвать цепь вверх на шаги, которые вы можете условно выполняете на основе содержимого 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){...}); 
+0

Это похоже на работу, вы, вероятно, можете сказать, что я новичок в javascript. Из моего понимания цепочки работает, потому что следующий метод наследует объект, выводимый из предыдущего метода. Итак, здесь мы просто задаем объект «q» и продолжаем добавлять к нему новые методы. метод exec должен проверять все другие методы, связанные с q. Спасибо за вашу помощь. –

Смежные вопросы