2013-07-23 1 views
1

을 마련하지 못할 : 나는 사용자가 이미지를 업로드 할 수 있으며, 지난 1000 업로드 된 이미지를 표시하는 '최신 업로드'페이지가있는 IMGUR 클론을, 건물입니다내가이 문제를 해결하고 좋은 MongoDB의 스키마

.

    그들이 가입 하지만
  • 사용자가 자신의 이메일 주소를 확인할 때까지, 자신의 업로드에 표시되지 않는
  • 사용자는 즉시 사진을 업로드 할 수있는 '최근 업로드'즉시 사용자로
  • 자신의 이메일을 확인하면 이미지가 표시되기 시작합니다. 사용자가 금지되는 경우
  • 은, 자신의 이미지는 '최근 업로드'에 표시되지 않습니다

원래 나는 이미지는 사용자 심판을 포함했다, 나는 사용자를 채우는 지난 1000 개 이미지를 선택합니다. 그런 다음 반환 된 컬렉션을 반복하여 금지 된 사용자 또는 확인되지 않은 사용자가 소유 한 이미지를 삭제합니다. 확인되지 않은 사용자가 지난 1000 개의 이미지를 업로드하면이 오류가 발생합니다.

사용자 개체에 내부 이미지 문서의 배열을 사용하는 것이 고려 중이나 사용자가 많은 이미지를 소유하고 있으며 사용자 개체를로드 할 때 항상 이미지를로드하고 싶지 않기 때문에 바람직하지 않습니다.

나는 어떤 솔루션에 열려입니다

+0

난 당신이 이미지 ID를 포함하는 "가입"모음, 사용자 ID, 날짜, 사용자의 상태 (잠재적으로 복합 인덱스)를해야합니다 생각합니다. 사용자 상태가 변경되면 컬렉션을 업데이트하십시오. 이 컬렉션에서 쿼리를 수행 한 다음'$ in'을 사용하여 다른 컬렉션에서 필요한 세부 정보를 가져옵니다. – WiredPrairie

답변

1

나는 것 수행 I 응용 프로그램의 가지고있는 지식을 바탕으로 다음

두 개의 서로 다른 컬렉션에 있어야 두 개의 엔티티가 있습니다 : 사용자 및 업로드 .

업로드 컬렉션이 매우 커질 수 있으므로 검색어에 필요한 규모와 성능을 처리 할 수 ​​있도록 컬렉션을 색인 및 분류 할 수 있어야합니다. 그렇게 말한다면, 업로드에서 몇 가지 주요 요소는 다음과 같습니다

uploads= 
{ 
_id:uploadId 
user:{id:userId, emailverified:true, banned:false} 
ts:uploadTime 
. 
. 
. 
} 

가능한 인덱스 :

i. {ts:1,banned:1,"user.emailverified":1,"user.banned":1} (this index should be multi-purpose) 
ii. {"user.id":1,ts:1} 

주 내가 최근 1000 쿼리를 최적화하기 위해 일부 중복 데이터를 저장합니다. 비용은 드문 경우로 이메일 확인 및 금지가 업데이트되어야하는 경우 사용자 컬렉션과 업로드 컬렉션에 대한 업데이트를 실행해야합니다 (이 중 하나는 멀티가 필요합니다 : true).

쿼리

db.uploads.find({ts:{$gt:sometime},banned:false,emailverified:true}.sort({ts:-1}).limit(1000) 
관련 문제