본문 바로가기
카테고리 없음

MongoDB에서 특정 필드를 제외하고 데이터 조회하는 방법

by BillyCho 2025. 2. 20.

MongoDB를 사용할 때, 특정 속성을 제외하고 데이터를 가져와야 하는 경우가 있습니다. 예를 들어, 사용자의 비밀번호나 내부적으로 사용되는 민감한 데이터를 클라이언트에 노출하지 않도록 해야 합니다. 이를 위해 Mongoose에서 .select() 메서드를 활용할 수 있습니다.

기본적인 데이터 조회 코드

다음과 같이 Content 컬렉션에서 모든 데이터를 조회하는 API를 만들 수 있습니다.

app.get("/api/contents", async (req, res) => {
  try {
    const contents = await Content.find().lean();
    res.status(200).json(contents);
  } catch (error) {
    console.error("콘텐츠 조회 오류:", error);
    res.status(500).json({
      success: false,
      error: "서버 오류로 콘텐츠를 불러올 수 없습니다",
    });
  }
});

 

이 코드는 Content 컬렉션의 모든 문서를 가져와 JSON 형식으로 반환합니다. 하지만 특정 필드를 제외하지 않기 때문에 모든 필드가 포함되어 응답됩니다.

특정 필드를 제외하는 방법

Mongoose에서는 .select({ 필드명: 0 })을 사용하면 특정 필드를 제외할 수 있습니다. 예를 들어, quizzes라는 필드를 제외하고 데이터를 가져오려면 다음과 같이 작성합니다.

app.get("/api/contents", async (req, res) => {
  try {
    const contents = await Content.find().select({ quizzes: 0 }).lean();
    res.status(200).json(contents);
  } catch (error) {
    console.error("콘텐츠 조회 오류:", error);
    res.status(500).json({
      success: false,
      error: "서버 오류로 콘텐츠를 불러올 수 없습니다",
    });
  }
});

.select() 메서드 설명

  • { quizzes: 0 } → quizzes 필드를 제외하고 나머지 필드만 가져옵니다.
  • .lean() → Mongoose의 Document 객체 대신 일반 JavaScript 객체를 반환하여 성능을 향상시킵니다.

여러 필드를 제외하는 방법

여러 개의 필드를 제외하고 싶다면 다음과 같이 객체에 여러 필드를 명시하면 됩니다.

const contents = await Content.find().select({ quizzes: 0, createdAt: 0 }).lean();

이렇게 하면 quizzes와 createdAt 필드가 제외된 데이터를 가져올 수 있습니다.

특정 필드만 포함하는 방법

반대로 특정 필드만 선택해서 가져오고 싶다면 1을 사용하면 됩니다.

const contents = await Content.find().select({ title: 1, description: 1 }).lean();

위 코드는 title과 description 필드만 가져오고 나머지 필드는 제외합니다.

결론

Mongoose의 .select() 메서드를 사용하면 특정 필드를 제외하거나 포함하여 데이터를 조회할 수 있습니다. 특히 보안상 중요한 정보는 클라이언트에 노출되지 않도록 select({ 필드명: 0 })을 적극적으로 활용하는 것이 좋습니다.