2014-09-23 6 views
1

노드 (v0.10) 스택을 처음 사용합니다.node.js 다국어 프리젠 테이션에 대한 지침이 필요합니다.

나는 (희망)과 같은 최신 MongoDB의 다국어 기사 한 : 나는대로 쿼리 내가 특정 언어의 기사를 표시

_id 
...more fields... 
text: [ 
{lang: 'en', title: 'some title', body: 'body', slug: 'slug'}, 
.... 
] 

매번는 다음과 같습니다

을 나는 다음과 같은 달성하기 위해 노력하고
var query = Model.findOne({'text.slug': slug}); 
query.exec(function(err, doc){ 
async.each(doc.text, function(item, callback){ 
    if (item.lang == articleLang) { 
     //populate the article to display 
    } 
}); 

res.render('view', {post:articleToDisplay}); 
}); 

슬러그는 각 언어마다 고유합니다. 문제는 몽고가 검색 한 서브 디렉터리가 아닌 모든 서브 코드가있는 전체 문서를 반환한다는 것입니다. 이제는 모든 하위 문서를 반복하고 클라이언트 측에 적절한 것을 표시하거나 서버에서 async.each를 사용하여 필요한 서브 디렉토리를 얻고 그 중 하나만보기로 보내야합니다. 나는 서버에서 비동기로 그것을하고있다. 그 확인은? 또한 async는 비동기 적으로 반복되지만 노드는 여전히 전체 루프가 끝날 때까지 대기 한 다음 뷰를 렌더링합니다. async.each가 완료 될 때까지 사용자가 실제로 차단되었다고 생각하는 것이 빠졌습니까? 나는 여전히 비동기 실행에 대한 내 머리를 감싸하려고 노력하고있다. 이 코드를 관리하는 방법을 개선 할 수있는 방법이 있습니까? 그것은 subdocs 꽤 표준 절차로 보인다!

미리 도움 주셔서 감사합니다.

답변

0

원하는 것을 얻으려면 aggregation pipeline을 사용해야합니다. 간단한 findOne()을 사용하면 도움이되지 않습니다. 그러면 mongodb이 코드를 작성하도록 허용하기보다는 코드에 하위 문서를 수정해야하기 때문입니다. find()findOne()은 문서가 검색 기준과 일치 할 때 전체 문서를 반환합니다.

집합 피플 라인에서 이것을 달성하려면 $unwind$match 연산자를 사용할 수 있습니다.

$unwind: 

출력하도록 상기 입력 문서의 각 요소에 대한 문서 배열 필드를 해체. 각 출력 문서는 입력 필드 이고 배열 필드의 값은 요소로 바뀝니다.

text 값 배열을 기반으로 문서를 풀어 라.

$match: 

다음 파이프 라인 단계에 지정된 조건 (들)과 일치하는 문서 만 전달하는 문서를 필터링합니다.

그런 다음 $match 연산자를 사용하여 적절한 문서를 찾습니다.

db.Model.aggregate([ 
{$unwind:"$text"}, 
{$match:{"text.slug":slug,"text.lang":articleLang}} 
]) 

이렇게하는 것은 그 text 필드는 하나의 객체를 포함하는 당신에게 하나의 문서를 반환합니다. 예컨대, (출력에서 text 필드 배열이 아닌 주)

{ "_id" : ... ,.., "text" : { "slug" : "slug", "lang" : "en" ,...} } 
+0

감사! 내 질문에 대답 할 수 있다면 비동기.각각은 모든 옵션이 반복 될 때까지 앱을 차단하고 있으며이를 답변으로 받아 들일 것입니다. – sunlover

+0

그래, 여전히 모든 배열 항목을 순차적으로 처리하는 것이 아니라 비동기식으로 반복 처리한다는 의미입니다. http://www.sebastianseilund.com/nodejs-async-in-practice - 비동기가 어떻게 작동하는지 더 잘 이해할 수 있습니다. async.each() ..는 여전히 비동기 적으로 실행됩니다. 그러나 모든 작업이 완료된 경우, 즉 모든 개별 텍스트 필드가 반복되고 뷰를 렌더링 할 때만 컨트롤을 다시 가져옵니다. 오히려 일치하는 항목이 있는지 확인하고 마지막 콜백을 호출하거나 다른 모든 작업을 중지하여 종료하는 변수를 설정할 수 있습니다. – BatScream

+0

@sunlover : 위 응답에 대한 태그. – BatScream

관련 문제