2013-02-19 1 views
1

안녕하세요 난 당신이 내가 당신이 방법을 알고있는 경우이 쉽게 이루어집니다 의심, 나 동적 메소드 체인을 구축 할 수 있는지 궁금 배열에서 메소드를 추가 mongo 데이터베이스를 쿼리하고 있습니다. ,은, 몽구스와 Node.js를 I을 사용하여</p> <p>...

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' 
     } ] 
    } 

나는 동적으로 쿼리를 작성하고있어, 그리고 기능에 내가 채울해야합니다 얼마나 많은 필드 모르는 : 는 내가 객체가되는 다음과 같습니다 전달한 함수를 사용 오프셋 또는 제한이 필요한지 여부를 나타냅니다.

나는 체인 내 발견 : 원함에 방법을 .skip 추가 인 경우

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

내가 동적으로 체인을 구축하려면 어떻게, 내가 테스트 개체에 제공된 오프셋 여부를 테스트해야합니다을 체인 등, 그리고 populate 메서드와 함께, 항목의 배열이있을 것입니다, 그 배열의 각 항목은 체인에 추가하는 새로운 채우기 메서드가 필요합니다.

마지막으로 체인 끝까지 exec 메소드가 필요합니다. 당신은 조건부 transaction의 내용을 기반으로 수행 할 수있는 단계로 체인을 분리 할 수 ​​있습니다

// 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를 확장 할 예정입니까? –

+0

'skip','limit','exec' 메쏘드가'transaction'이나'model'에 작용하기를 원합니까? – Bergi

+0

이 기능을 분리 한 이유는 많은 모델에서이 기능을 반복 할 예정이기 때문입니다. 트랜잭션 객체가 제공하는 레코드를 주어진 모델에서 찾고 싶습니다. 나는 뭔가를 잘못 이해하고 있는가? 현재는 그대로 작동하지만 누락 된 '제한'과 같은 속성을 처리하지 않으며 .populate 메소드를 실행하지 않습니다. 변경 사항을 동적으로 추가하는 방법을 사용할 수 없기 때문에 정렬. –

답변

1

사전에 도움을

감사합니다 :

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

이것은 작동하는 것 같아요, 당신은 아마 내가 자바 스크립트에 새로운라고 말할 수 있습니다. 다음 메서드는 이전 메서드에서 개체 출력을 상속하기 때문에 내 이해 chaining 작동합니다. 여기서 우리는 객체 'q'를 설정하고 새로운 메소드를 계속 추가합니다. exec 메소드는 q에 첨부 된 다른 모든 메소드를 검사해야합니다. 당신의 도움을 주셔서 감사합니다. –