2011-07-26 2 views
1

나는이 경우 같은 created_at 및 nb_likes 데이터와 MongoDB를에 요소의 목록을 가지고 고유 한 정수 값 없음의 분류에 이전/다음 요소를 것은 :

[{'_id':'1234', 'nb_likes':1, 'created_at':'2010-08-01'}, 
{'_id':'1235', 'nb_likes':2, 'created_at':'2010-08-02'}, 
{'_id':'1236', 'nb_likes':2, 'created_at':'2010-08-03'}, 
{'_id':'1237', 'nb_likes':3, 'created_at':'2010-08-02'}, 
{'_id':'1238', 'nb_likes':3, 'created_at':'2010-08-03'}] 

나는하여이 컬렉션을 정렬 할 경우 'nb_likes'명령.

db.users.find().sort(['nb_likes':-1]) 

는하지만 난 'nb_likes'에 의해 주문하는 경우 '1236'문서의 이전 및 다음 요소를 발견 할 수 있습니다. 컬렉션을 보면 이전 요소는 문서 '1235'이고 다음은 '1237'입니다. 이전 및 다음 요소를 알고 요청을 원한다면, 내가 할 :

db.users.find({'nb_likes':{'$gt':2}}).sort(['nb_likes':-1]) 

db.users.find({'nb_likes':{'$lt':2}}).sort(['nb_likes':1]) 

다음 얻기 위해 이전 얻을 그러나이 경우에 할 수 있습니다. 나는

db.users.find({'nb_likes':{'$gte':2}}).sort(['nb_likes':-1]) 

다음

db.users.find({'nb_likes':{'$lte':2}}).sort(['nb_likes':1]) 

를 얻을 그러나이 경우에

이전 얻을 그래서 나는이 문서를 가지고 '$ GTE'를 사용 2.와 nb_likes 모든 문서를 건너 뜁니다. 두 번째 요소는 항상 반환됩니다. 다음 및 이전 요소에서.

은 내가 더 'nb_likes'일부 문서 만 오래된 'created_at'

그래서 내가해야 할 일을 요청 알 수 삭제 내 문서보다 적은 이상 'created_at'만 문서를 제한하는 경우 좋은 결과를 얻으려고.

좋은 해결책은 내 목록에이 문서의 위치를 ​​가지고 있고 skip()limit(1)

나는 모든 좋은 해결책 열어주는 말들하는 것입니다. SQL에서 동일한 문제가 발생하는지 여부는 알 수 없습니다.

+0

ID 1235와 요소 요소 1236 '전에'왜? –

+0

기본적으로 두 번째 정렬은 about_ created_at입니다. sort ([ 'nb_likes': - 1], [ 'created_at': 1])'로 정렬 할 수 있습니다. 두 요소의 순서가 같을 때 기본적으로 수행합니다. – shingara

+0

무엇입니까? Mongo 질의는 예제로 제공 한 정렬 된 목록을 가져옵니다. nb_likes가 2보다 크고 id가 document_id보다 작은 경우 –

답변

0
var prev = db.users.find({'nb_likes': {$lte: 2}, '_id': {$lt: 1236}}).sort({'nb_likes': -1}) 
var next = db.users.find({'nb_likes': {$gte: 2}, '_id': {$gt: 1236}}).sort({'nb_likes': 1}) 

나중에 편집

일반 솔루션 :

의 당신이 정렬 된 목록/쿼리에 의해 반환 (몽고, SQL 주어, 어쨌든 문제가되지 않는 것으로 가정 해 봅시다). order이 DESC 또는 ASC가 될 수

sort_clause = 
    kw1: order, 
    kw2: order, 
... 

: 쿼리의 형식은 정렬 절을 가지고 있습니다.

내가 연산 (순서)를 정의 할 것이다 : 이전 요소에 대한

SELECT select_clause 
WHERE 
    kw1 op(order) E.kw1, 
    kw2 op(order) E.kw2, 
    ... 
ORDER BY sort_clause 
OFFSET 1 
LIMIT 1 

아날로그 :

이제
<=, if order is DESC 
>=, if order is ASC 

이 요소 E에 다음을 얻기 위해, 당신은 같은 쿼리를 구성해야합니다.

나중에 편집이

경우 내 솔루션을 적용하는 두 번째 순서 열이다 created_at ASC :

var prev = db.users.find({'nb_likes': {$lte: 2}, 'created_at': {$lte: '2010-08-03'}}).sort({'nb_likes': -1, 'created_at': -1}).skip(1).limit(1) 
var next = db.users.find({'nb_likes': {$gte: 2}, 'created_at': {$gte: '2010-08-03'}}).sort({'nb_likes': 1, 'created_at': 1}).skip(1).limit(1) 
+0

을 사용할 수 없습니다. 그래서 당신은 나쁜 결과를 가질 수 있습니다 : ( – shingara

+0

그럼 당신의 정렬 기준은 무엇입니까? X.nb_likes = Y.nb_likes라면 요소 X가 원소 Y보다 먼저 존재한다고 어떻게 결정합니까? –

+0

두 번째 정렬은 차이를 만듭니다. 예를 들어, 두 번째 요소에 대한 쿼리를 수행 할 수 없습니다. 요소가 – shingara