2014-02-22 2 views
6

나는 문서의 ID를 가지고 있으며 그 문서와 그 뒤에 오는 10 개의 문서와 10 개의 문서를 반환해야합니다. 총 21 개 문서MongoDB에서 ID 주변의 문서 범위 반환

키의 시작 또는 끝 값이 없습니다. 어느 한 방향으로 만 한계.

가장 좋은 방법은? 미리 감사드립니다.

+0

불행히도 당신은'.find()'를 실행하여 전체 콜렉션을 얻었을 것입니다. 타겟 문서를 찾을 때까지 반복하고, 다음 + 10/-10을 얻을 때까지 커서가 있어야합니다. '.find()'에서 나온 것입니다. – tymeJV

+0

@tymeJV 저는 그렇게 생각하지 않습니다. –

+0

@ NeilLunn의 답변을 참조하십시오. +1 – tymeJV

답변

5

ObjectID's에 타임 스탬프가 있습니까? 따라서 이러한 요소는 항상 자연 삽입 순서를 나타냅니다. ,

{ "_id" : ObjectId("5307f2d80f936e03d1a1d1c8"), "a" : 1 } 
{ "_id" : ObjectId("5307f2db0f936e03d1a1d1c9"), "b" : 1 } 
{ "_id" : ObjectId("5307f2de0f936e03d1a1d1ca"), "c" : 1 } 
{ "_id" : ObjectId("5307f2e20f936e03d1a1d1cb"), "d" : 1 } 
{ "_id" : ObjectId("5307f2e50f936e03d1a1d1cc"), "e" : 1 } 
{ "_id" : ObjectId("5307f2e90f936e03d1a1d1cd"), "f" : 1 } 
{ "_id" : ObjectId("5307f2ec0f936e03d1a1d1ce"), "g" : 1 } 
{ "_id" : ObjectId("5307f2ee0f936e03d1a1d1cf"), "h" : 1 } 
{ "_id" : ObjectId("5307f2f10f936e03d1a1d1d0"), "i" : 1 } 
{ "_id" : ObjectId("5307f2f50f936e03d1a1d1d1"), "j" : 1 } 
{ "_id" : ObjectId("5307f3020f936e03d1a1d1d2"), "j" : 1 } 

그래서 우리는 "F"의 _id 알고 그것을하고 다음 두 문서를 얻을 :

우리의 문서 : 당신이 알고있는 문서 후 전에 문서를 찾고 있다면 그래서 _id 당신은이 작업을 수행 할 수 있습니다 :

> db.items.find({ _id: {$gte: ObjectId("5307f2e90f936e03d1a1d1cd") } }).limit(3) 

{ "_id" : ObjectId("5307f2e90f936e03d1a1d1cd"), "f" : 1 } 
{ "_id" : ObjectId("5307f2ec0f936e03d1a1d1ce"), "g" : 1 } 
{ "_id" : ObjectId("5307f2ee0f936e03d1a1d1cf"), "h" : 1 } 

그리고 역으로 동일한 작업을 수행 :

> db.items.find({ _id: {$lte: ObjectId("5307f2e90f936e03d1a1d1cd") } }) 
    .sort({ _id: -1 }).limit(3) 
{ "_id" : ObjectId("5307f2e90f936e03d1a1d1cd"), "f" : 1 } 
{ "_id" : ObjectId("5307f2e50f936e03d1a1d1cc"), "e" : 1 } 
{ "_id" : ObjectId("5307f2e20f936e03d1a1d1cb"), "d" : 1 } 

그리고 그것은 입니다.은 컬렉션을 스캔하는 것보다 더 나은 방법입니다.

1

Neil의 대답은 (사용자가 자동 ​​생성 된 ObjectIds를 사용한다고 가정 할 때) 질문에 대한 좋은 대답이지만 주어진 문서 앞뒤에있는 10 개의 문서 개념에 약간의 미묘함이 있음을 기억하십시오.

ObjectId의 전체 형식은 here으로 기록되어 있습니다. 그 다음 필드로 구성되어 있습니다 :

  • 기계 식별자는
  • 프로세스 ID는
  • 카운터
  • 지정하지 일반적 경우,

    • 타임 스탬프 1 초 해상도 당신의 자신의 _id는 클라이언트 시스템의 드라이버가 자동으로 생성합니다. 따라서 ObjectId가 클라이언트 단일 시스템의 단일 프로세스에서 생성되는 경우 해당 순서는 실제로 생성 된 순서를 반영하며, 일반적인 응용 프로그램에서는 삽입 순서 (있지만 반드시 필요하지는 않음)가됩니다. 그러나 여러 프로세스 또는 여러 클라이언트 시스템이있는 경우 해당 여러 원본에서 지정된 초 내에 생성 된 개체의 ObjectId 순서는 삽입 순서와 예측할 수없는 관계가 있습니다.