2013-12-13 1 views
2

여러 필드를 사용하여 복잡한 정렬 순서가 있습니다. '입력 개체'는 쿼리에 의해 정의 된 첫 번째 일괄 처리의 첫 번째 항목입니다. 항목 항목이 맨 위에 표시되는 무한 스크롤러를 만들려고합니다. 예상대로 스크롤을 아래로 스크롤하고 항목 항목 앞의 항목을 표시합니다.MongoDB : 양쪽 방향으로 복잡한 정렬 순서를 제한하고 건너 뜁니다.

"username"과 같은 고유 한 필드에 간단한 정렬을 사용하는 것은 꽤 쉽지만 내 경우에는 고유 한 순서를 생성하기 위해 정렬에 적어도 세 개의 필드가 필요합니다.

정렬 순서를 바꾸는 것도 문제가되지 않습니다.

질문은 항목 개체를 정의하고 건너 뛰기 및 제한을 사용하여 정렬 된 컬렉션에서 항목을 가져 오는 방법과 그 이전에 항목을 가져 오는 방법입니다. skip에 대한 음수 값은 afaik 허용되지 않습니다.

Object.rating_watchable.where(:avg_rating.gte => 3).skip(0).limit(BATCH_SIZE)

이를 : 첫 번째 목적은 다음에서 반환

scope :rating_watchable, order_by(avg_rating: :desc, release_date: :desc, title: :asc)

위치 0에있는 '항목의 객체이다 mongoid 사용

및 종류를 레일에 의해 정의된다 마지막 질의는 객체를 올바르게 반환하고 정렬 순서를 바꾸면 올바른 순서로 객체를 가져올 수 있지만 상대적인 "where"를 사용하여 동일한 항목 객체를 정의하는 방법을 생각할 수 없습니다 이자형. 건너 뛰기/제한을 역순으로 수행하려면이 코드가 필요합니다.

물론이 같은 부정적인 스킵이 좋을 것이다 :

Object.rating_watchable.where(:avg_rating.gte => 3).skip(-BATCH_SIZE * batch_num).limit(BATCH_SIZE)

어쩌면 나는이 작업을 수행하는 더 좋은 방법을 누락을?

답변

0

근본적인 문제는 정렬 순서가 있고 개체의 인덱스 (항목 개체)를 정렬 순서로 찾으려고한다는 것입니다. 정의에 따라 정렬 순서로 항목 객체의 색인을 가져 오려면 정렬에서 결과를 가져와야합니다. 그래서 ...

1) 정렬 _id의

감안할의 항목 객체 _id의 인덱스를 찾기) 후, 정렬에서 _id에게 3의 가져 오기) 한 후, 2 항목 개체의 _id 가져 오기 위의 경우 건너 뛰기 및 제한을 사용하여 항목 개체에서 시작하는 초기 페이지를 표시하고 적절한 건너 뛰기 및 한도 값을 계산하여 정렬 순서대로 페이지 단위로 앞뒤로 이동할 수 있습니다.

MongoDB를 사용하면 문서에서 선택된 최상위 필드를 "프로젝트"할 수 있습니다.이 기능을 사용하여 _id를 선택하면 전체 정렬 결과에 대해 전체 문서를 비 직렬화 할 때 오버 헤드를 지불 할 필요가 없습니다. http://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/ - Mongoid에서는 Moped에서 # pluck로 쿼리합니다. #select입니다. http://mongoid.org/en/mongoid/docs/querying.html

희망이 있습니다.

+0

감사합니다. 나는 꽤 못생긴 중복 코드를 일으키는 다른 일을 끝내지 만 작동하지 않습니다. forward와 reverse 정렬 순서를 정의하면 건너 뛰기 및 제한 작업이 .where 항목을 (앞으로의 방향으로) 포함하도록. 제외 (역방향). 또한 두 개의 정렬 순서를 지원하는 색인을 정의해야합니다. 실제로 이것은 너무 어렵지 않았습니다. 한 주문에 대해서는 .gte로.다른 한편으로 이것은 각 주문 필드에 대해 수행되어야합니다. 당신의 대답은 더 간단한 코드로 이어질 수 있습니다. – pferrel