Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB find()는 항상 모든 필드를 반환할까요? 프로젝션으로 특정 필드만 조회하는 방법


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 → 지정한 필드를 제외한 나머지 모든 필드 반환
  • 프로젝션 생략 → 모든 필드 반환