2012-06-14 7 views
0

PHP와 MongoDB를 사용하여 webapp를 개발 중입니다. 이 응용 프로그램에서는 두 개의 모음을 유지합니다. 하나는 파일에 대한 데이터를 보관하고 하나는 각 파일에 대한 다운로드 이벤트를 추적합니다.MongoDB에서 위조 된 가입 방법?

최근 다운로드 한 파일이 10 개 필요하지만 조인은 옵션이 아닙니다. 이벤트 문서는 파일 ID 만 저장하고 다른 컬렉션은 축소판을 저장합니다.

바로 지금 내가 최근에 다운로드 한 10 개의 파일을 가져 와서 날짜순으로 정렬하지만 순서는 괜찮습니다.하지만이 파일 배열 (ID)을 사용하고 id가있는 파일을 찾는 where_in 쿼리를 만듭니다 ids 배열에. 이 또한 잘 작동합니다 (선택한 파일의 축소판을 가져옵니다)하지만 더 이상 주문을 유지할 수 없습니다. 가장 최근에 다운로드 한 파일이 맨 위에 없습니다.

어떻게해야 하나의 ID 대신 10 개의 새 쿼리를 만들 수 있습니까? 의

  1. 받기 모든 ID를 :

    내가 이상 40.000 문서 :이 짧은에서

    UPDATE

    을 가지고 있기 때문에 스키마를 변경할 수 없습니다 내가하고 싶은 것입니다 최근에 다운로드 한 파일 10 개. 다운로드 타임 스탬프로 정렬됩니다.

  2. 이 ID 배열을 사용하여 파일 컬렉션에 대한 쿼리를 만들고 각 파일의 세부 정보 (미리보기 이미지, 설명 등)를 가져옵니다.

위의 단계는 정상적으로 작동하지만 첫 번째 단계부터는 주문을 보관할 수 없으므로 가장 최근에 다운로드 한 파일을 맨 위에 가져올 수 없습니다. id 배열을 시험해보고 각 파일에 대한 데이터를 얻을 수 있지만 그 대신에 10 개의 쿼리가 필요하다는 것을 알고 있습니다.

답변

1

정말 문제가 없습니다. 여기에 약간의 의사 코드가 있습니다 :

// get last N download events 
events = get_latest_downloads() 

// retrieve associated file data 
file_array = get_all_file_info_by_events(events) 

display_data = [] 
for(e in events) { 
    data = find_file_info_in_the_array(file_array, e.file_id) 
    display_data.push(data) 
} 

// now display_data is contains full file info, sorted by download time. 
+0

하지만 루프의 각 턴마다 데이터베이스에 쿼리를해야합니까? 나는 MongoDB가 하나의 쿼리만을 만드는 배열로 쿼리를 지원하기 때문에이를 피하려고한다. –

+0

내 질문을 업데이트했습니다. 희망적으로 지금은 훨씬 더 명확 해집니다. @sergio tulentsev. –

+0

모든 파일에 대한 정보를 얻은 후에는'events' 배열에서 순서를 사용하여 최종 결과를 만듭니다. –

관련 문제