2013-03-30 3 views
1

몽고 컬렉션에는 단어 목록 (수백만 단어)이 있습니다.다음 및 이전 문서 얻기

{word:'a'} 
{word:'b'} 
{word:'x'} 
{word:'y'} 
{word:'z'} 

단어의 어휘 인접 문자 (다음 단어와 이전 단어)를 가져와야합니다. 나는 가장 효율적인 방법을 찾고있다.

+0

가 데이터베이스 다소 정적 또는 콘텐츠를 동적으로 혹독에 추가됩니다

는 다음 코드 예입니다. –

+0

@SushantGupta 완전히 정적 인 것은 아닙니다. 그러나 그것은 광범위합니다. – PHPst

+0

문제의 한가지 해킹은 간단히 db에 단어에 대한 간단한 사전 식 순위를 저장하는'word_index'와 같은 여분의 필드를 제공하는 것입니다. 그리고 나서 [n-1, n, n + 1]의 질의에서 n은 단어 색인이라는 간단한 $를 사용했을 것입니다. 하지만 그것은 단지 당신의 데이터베이스가 정체되어 있다면 의미가 있습니다. 또는 db가 예약 된 간격 후에 업데이트 되더라도 동적으로 업데이트되지는 않습니다. db의 모든 변경 사항에 대해 전체 테이블 업데이트가 필요하기 때문입니다. –

답변

2

단순히 두 개의 쿼리를 실행하면 어떨까요?

첫 단어는 '단어'가 'YOURWORD'인 문서를 검색하고 '단어'(오름차순), 한도로 정렬 한 다음 두 번째 단어는 '단어 <', 'YOUTWORD' ', 정렬 'word'(desc)를 다시 한 번 입력하십시오.

필자는 색인을 작성 했으므로 상당한 성능을 발휘할 것입니다.

var prev = db.words.find({"word": {$gt: "YOURWORD"}}).sort({"word": 1}).limit(1); 
var next = db.words.find({"word": {$lt: "YOURWORD"}}).sort({"word": -1}).limit(1); 
+0

웹 페이지의 간단한 기능을 보려면 <이전 | curr_page | next>는 2 개의 쿼리를 수행하는 데 불필요한 오버 헤드가되지 않습니다. 인덱스를 갖는 것은 큰 요인이지만 db 쿼리를 실행하는 데 약간의 오버 헤드가 있어야합니다. 비록 나 자신을이 질문을 나의 대답으로 게시하려고 생각했지만, 그때 나는 어떤 섹시한 해결책이 존재할 때까지 기다릴 것이라고 생각했다. : P –

+0

@PHPst 인덱스 후에는 실제로 정렬이 매우 효율적입니다. 귀하의 경우 색인을 가지고 스캔 된 요소는 단지 2 일 것입니다. 그래서 O (1)의 복잡성. –

+0

MongoDB는 저장된 레코드의 순서를 보장하지 않으므로 정적 위치 지정에 의존 할 수 없습니다. 어떤 종류의 정렬이 필요합니다. 또 다른 (나쁜) 옵션은 참조를 업데이트 된 상태로 유지하기 위해 새로운 삽입 및 업데이트 중에 많은 처리가 필요한 prev/next db 참조를 갖는 것입니다. 그리고 업데이트가 동시에 발생하면 일관성 문제가 발생할 수 있습니다. – alexcasalboni