MongoDB에서 컬렉션의 첫 번째 문서와 마지막 문서를 동시에 가져오려면 aggregate() 메서드와 함께 $first, $last 집계 연산자를 사용하는 것이 가장 효율적입니다. 이 방법을 사용하면 별도의 쿼리를 두 번 실행할 필요 없이 단일 파이프라인으로 두 문서를 모두 얻을 수 있습니다.
실제 예제를 통해 살펴보겠습니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 데모용 컬렉션을 만들고 문서를 삽입합니다.
> db.demo73.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e29c41b71bf0181ecc4226c")
}
> db.demo73.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e29c41e71bf0181ecc4226d")
}
> db.demo73.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e29c42271bf0181ecc4226e")
}2. 전체 문서 확인하기
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.
> db.demo73.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e29c41b71bf0181ecc4226c"), "Name" : "Chris" }
{ "_id" : ObjectId("5e29c41e71bf0181ecc4226d"), "Name" : "Bob" }
{ "_id" : ObjectId("5e29c42271bf0181ecc4226e"), "Name" : "David" }3. $first와 $last로 첫 번째·마지막 문서 조회하기
이제 $group 스테이지 안에서 $first와 $last 연산자를 사용하여 첫 번째 문서와 마지막 문서를 한 번에 가져옵니다. 여기서 $$ROOT는 그룹화되는 각 문서 전체를 의미하며, _id: null
> db.demo73.aggregate({
... $group: {
... _id: null,
... first: { $first: "$$ROOT" },
... last: { $last: "$$ROOT" }
... }
... }
... );실행 결과는 다음과 같습니다.
{
"_id" : null, "first" : { "_id" : ObjectId("5e29c41b71bf0181ecc4226c"), "Name" : "Chris" }, "last" : {
"_id" : ObjectId("5e29c42271bf0181ecc4226e"), "Name" : "David"
}
}정리 및 참고 사항
결과를 보면 첫 번째 문서(Chris)와 마지막 문서(David)가 하나의 객체로 함께 반환된 것을 확인할 수 있습니다.
몇 가지 유의할 점은 다음과 같습니다.
- $first와 $last는 입력 순서 기준으로 동작하므로, 특정 필드 기준의 첫/마지막 문서가 필요하다면 $group 앞에 $sort 스테이지를 추가해야 합니다.
- 정렬 기준 필드에 인덱스가 있다면 $sort + $limit 조합이나 find().sort().limit(1) 방식이 더 빠를 수 있습니다.
- 반면, 전체 문서 중 자연 순서상 첫/마지막 값을 하나의 쿼리로 동시에 얻어야 할 때는 위의 $group 방식이 가장 간결하고 효율적입니다.