MongoDB에서 결과 목록 중 특정 인덱스에 해당하는 요소 하나만 가져오려면 집계 파이프라인(aggregation)과 $limit을 사용하면 됩니다. 여기에 $skip을 함께 활용하면 지정한 개수만큼 문서를 건너뛴 뒤 원하는 위치의 문서 한 개만 정확하게 조회할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 이용해 문서 3개를 포함하는 컬렉션을 만들어 보겠습니다.
> db.demo391.insertOne(
... { "_id" : 101, "Name" : "Chris", Values: ["101", "102"] }
... )
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo391.insertOne(
... { "_id" : 111, "Name" : "Chris", Values: ["101", "102"] }
... )
{ "acknowledged" : true, "insertedId" : 111 }
> db.demo391.insertOne(
... { "_id" : 121, "Name" : "Chris", Values: ["101", "102"] }
... )
{ "acknowledged" : true, "insertedId" : 121 }
2. 저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 들어 있는 모든 문서를 확인할 수 있습니다.
> db.demo391.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 101, "Name" : "Chris", "Values" : [ "101", "102" ] }
{ "_id" : 111, "Name" : "Chris", "Values" : [ "101", "102" ] }
{ "_id" : 121, "Name" : "Chris", "Values" : [ "101", "102" ] }
3. 인덱스를 기준으로 단일 요소 조회하기
다음은 인덱스 값을 기준으로 결과에서 해당 순번의 문서 하나만 가져오는 쿼리입니다. 변수 i에 원하는 위치(순번)를 저장한 뒤, $match로 조건에 맞는 문서를 필터링하고, $skip으로 i-1개의 문서를 건너뛴 후 마지막에 $limit으로 1개만 선택합니다.
> var i=2;
> db.demo391.aggregate([
... { $match : {"Name": "Chris"}},
... { $skip : i-1},
... { $limit : 1 }
... ]);
쿼리를 실행하면 앞의 1개 문서를 건너뛴 두 번째 문서만 반환되는 것을 확인할 수 있습니다.
{ "_id" : 111, "Name" : "Chris", "Values" : [ "101", "102" ] }
이처럼 $match → $skip → $limit 순서로 집계 파이프라인을 구성하면, 배열 형태의 결과에서 원하는 인덱스 위치의 요소 하나를 간단하고 효율적으로 추출할 수 있습니다.