MongoDB에서 collection.find()를 실행하면 기본적으로 문서에 존재하는 모든 필드가 반환됩니다. 하지만 프로젝션(projection)을 활용하면 원하는 필드만 선택적으로 조회하거나, 특정 필드를 제외한 결과를 얻을 수 있습니다.
필드 프로젝션 기본 문법
Case 1 — 특정 필드만 포함하기
find()의 두 번째 인자에 필드 이름을 지정하고 값을 1로 설정하면 해당 필드만 반환됩니다.
db.yourCollectionName.find({}, { "yourFieldName": 1 }).pretty();
필드 값을 1로 설정하면 그 필드만 결과에 포함됩니다. 반대로 0으로 설정하면 해당 필드만 제외되고 나머지 모든 필드가 반환됩니다. 단, _id 필드는 명시적으로 "_id": 0으로 제외하지 않는 한 항상 함께 반환된다는 점을 기억하세요.
Case 2 — 특정 필드 제외하기
db.yourCollectionName.find({}, { "yourFieldName": 0 }).pretty();
예제 데이터 준비
문법을 실제로 확인하기 위해 문서가 포함된 컬렉션을 생성해 보겠습니다. 컬렉션 생성 쿼리는 다음과 같습니다.
> db.returnFieldInFindDemo.insertOne({ "StudentName": "John", "StudentAge": 23, "TechnicalSubject": ["MongoDB", "MySQL"] });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ebfe72f684a30fbdfd566")
}
> db.returnFieldInFindDemo.insertOne({ "StudentName": "Mike", "StudentAge": 24, "TechnicalSubject": ["Java", "Python"] });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ebffd2f684a30fbdfd567")
}
> db.returnFieldInFindDemo.insertOne({ "StudentName": "Sam", "StudentAge": 22, "TechnicalSubject": ["C", "C++"] });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec00f2f684a30fbdfd568")
}
> db.returnFieldInFindDemo.insertOne({ "StudentName": "Carol", "StudentAge": 20, "TechnicalSubject": ["DataStructure", "Algorithm"] });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec0292f684a30fbdfd569")
}
find() 메서드로 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.returnFieldInFindDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c8ebfe72f684a30fbdfd566"),
"StudentName" : "John",
"StudentAge" : 23,
"TechnicalSubject" : [
"MongoDB",
"MySQL"
]
}
{
"_id" : ObjectId("5c8ebffd2f684a30fbdfd567"),
"StudentName" : "Mike",
"StudentAge" : 24,
"TechnicalSubject" : [
"Java",
"Python"
]
}
{
"_id" : ObjectId("5c8ec00f2f684a30fbdfd568"),
"StudentName" : "Sam",
"StudentAge" : 22,
"TechnicalSubject" : [
"C",
"C++"
]
}
{
"_id" : ObjectId("5c8ec0292f684a30fbdfd569"),
"StudentName" : "Carol",
"StudentAge" : 20,
"TechnicalSubject" : [
"DataStructure",
"Algorithm"
]
}
Case 1 — 특정 필드만 반환하기
이제 "TechnicalSubject" 필드만 조회해 보겠습니다. 프로젝션에서 해당 필드를 1로 설정합니다.
> db.returnFieldInFindDemo.find({}, { "TechnicalSubject": 1 }).pretty();
실행 결과:
{
"_id" : ObjectId("5c8ebfe72f684a30fbdfd566"),
"TechnicalSubject" : [
"MongoDB",
"MySQL"
]
}
{
"_id" : ObjectId("5c8ebffd2f684a30fbdfd567"),
"TechnicalSubject" : [
"Java",
"Python"
]
}
{
"_id" : ObjectId("5c8ec00f2f684a30fbdfd568"),
"TechnicalSubject" : [
"C",
"C++"
]
}
{
"_id" : ObjectId("5c8ec0292f684a30fbdfd569"),
"TechnicalSubject" : [
"DataStructure",
"Algorithm"
]
}
출력 결과를 보면 "TechnicalSubject" 필드를 1로 설정했기 때문에 모든 문서에서 해당 필드만 반환된 것을 확인할 수 있습니다. 물론 _id는 기본 동작에 따라 항상 함께 출력됩니다.
Case 2 — 특정 필드를 제외하고 반환하기
두 번째 경우는 "TechnicalSubject" 필드를 0으로 설정하는 것입니다. 이 경우 해당 필드를 제외한 나머지 모든 필드가 반환됩니다.
> db.returnFieldInFindDemo.find({}, { "TechnicalSubject": 0 }).pretty();
실행 결과:
{
"_id" : ObjectId("5c8ebfe72f684a30fbdfd566"),
"StudentName" : "John",
"StudentAge" : 23
}
{
"_id" : ObjectId("5c8ebffd2f684a30fbdfd567"),
"StudentName" : "Mike",
"StudentAge" : 24
}
{
"_id" : ObjectId("5c8ec00f2f684a30fbdfd568"),
"StudentName" : "Sam",
"StudentAge" : 22
}
{
"_id" : ObjectId("5c8ec0292f684a30fbdfd569"),
"StudentName" : "Carol",
"StudentAge" : 20
}
Case 3 — 프로젝션 없이 find()만 사용하기
앞서 설명했듯이 프로젝션 없이 find()만 호출하면 모든 필드가 그대로 반환됩니다.
> db.returnFieldInFindDemo.find();
실행 결과:
{ "_id" : ObjectId("5c8ebfe72f684a30fbdfd566"), "StudentName" : "John", "StudentAge" : 23, "TechnicalSubject" : [ "MongoDB", "MySQL" ] }
{ "_id" : ObjectId("5c8ebffd2f684a30fbdfd567"), "StudentName" : "Mike", "StudentAge" : 24, "TechnicalSubject" : [ "Java", "Python" ] }
{ "_id" : ObjectId("5c8ec00f2f684a30fbdfd568"), "StudentName" : "Sam", "StudentAge" : 22, "TechnicalSubject" : [ "C", "C++" ] }
{ "_id" : ObjectId("5c8ec0292f684a30fbdfd569"), "StudentName" : "Carol", "StudentAge" : 20, "TechnicalSubject" : [ "DataStructure", "Algorithm" ] }
정리
MongoDB의 find()는 반드시 모든 필드를 반환하지는 않습니다. 두 번째 인자로 프로젝션 객체를 전달하면 다음과 같이 동작합니다.
- 필드 값 1 → 지정한 필드만 반환 (
_id포함) - 필드 값 0 → 지정한 필드를 제외한 나머지 모든 필드 반환
- 프로젝션 생략 → 모든 필드 반환