나는 문서의 ID를 가지고 있으며 그 문서와 그 뒤에 오는 10 개의 문서와 10 개의 문서를 반환해야합니다. 총 21 개 문서MongoDB에서 ID 주변의 문서 범위 반환
키의 시작 또는 끝 값이 없습니다. 어느 한 방향으로 만 한계.
가장 좋은 방법은? 미리 감사드립니다.
나는 문서의 ID를 가지고 있으며 그 문서와 그 뒤에 오는 10 개의 문서와 10 개의 문서를 반환해야합니다. 총 21 개 문서MongoDB에서 ID 주변의 문서 범위 반환
키의 시작 또는 끝 값이 없습니다. 어느 한 방향으로 만 한계.
가장 좋은 방법은? 미리 감사드립니다.
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 }
그리고 그것은 입니다.은 컬렉션을 스캔하는 것보다 더 나은 방법입니다.
Neil의 대답은 (사용자가 자동 생성 된 ObjectIds를 사용한다고 가정 할 때) 질문에 대한 좋은 대답이지만 주어진 문서 앞뒤에있는 10 개의 문서 개념에 약간의 미묘함이 있음을 기억하십시오.
ObjectId의 전체 형식은 here으로 기록되어 있습니다. 그 다음 필드로 구성되어 있습니다 :
지정하지 일반적 경우,
불행히도 당신은'.find()'를 실행하여 전체 콜렉션을 얻었을 것입니다. 타겟 문서를 찾을 때까지 반복하고, 다음 + 10/-10을 얻을 때까지 커서가 있어야합니다. '.find()'에서 나온 것입니다. – tymeJV
@tymeJV 저는 그렇게 생각하지 않습니다. –
@ NeilLunn의 답변을 참조하십시오. +1 – tymeJV