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

MongoDB에서 _id를 제외한 모든 필드 값만 표시하는 쿼리 작성 방법

MongoDB에서 _id를 제외한 필드 값만 조회하기

MongoDB의 find() 메서드는 기본적으로 _id 필드를 포함한 모든 필드를 반환합니다. 하지만 데이터를 가공하거나 클라이언트에 전달할 때는 _id를 제외한 순수한 필드 값만 필요한 경우가 많습니다. 이번 글에서는 forEach() 반복문을 활용해 _id 없이 원하는 필드만 새로운 객체 배열로 만들어 출력하는 방법을 단계별로 살펴보겠습니다.

1단계: 샘플 컬렉션 생성

먼저 문서를 포함하는 컬렉션을 생성합니다.

> db.demo590.insert([
... { "Name": "Chris", "Age": 21 },
... {"Name": "Bob", "Age": 20},
... { "Name": "Sam", "Age": 19 }
... ]);
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

BulkWriteResult의 nInserted 값이 3으로 표시되면 세 개의 문서가 성공적으로 삽입된 것입니다.

2단계: find()로 전체 문서 확인

find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

> db.demo590.find();

실행 결과는 다음과 같습니다. 각 문서에 ObjectId 형태의 _id 필드가 자동으로 포함되어 있는 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5e92d514fd2d90c177b5bcd0"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e92d514fd2d90c177b5bcd1"), "Name" : "Bob", "Age" : 20 }
{ "_id" : ObjectId("5e92d514fd2d90c177b5bcd2"), "Name" : "Sam", "Age" : 19 }

3단계: _id를 제외한 필드 값만 추출하는 쿼리

다음은 빈 배열과 forEach()를 조합하여 _id를 제외한 필드 값만 새로운 키 이름으로 담아내는 쿼리입니다.

> var listOfObject = [];
> db.demo590.find().forEach(function(d){
...    var ob = {};
...    ob["StudentFirstName"] = d.Name;
...    ob["StudentAge"] = d.Age;
...    listOfObject.push(ob);
... });

이 쿼리는 각 문서를 순회하면서 Name과 Age 값을 읽어 StudentFirstName, StudentAge라는 새로운 키에 매핑한 뒤, 완성된 객체를 listOfObject 배열에 하나씩 추가합니다. 이 과정에서 _id는 의도적으로 제외됩니다.

4단계: 결과 확인

생성된 배열을 출력해 보겠습니다.

> listOfObject;

실행 결과 _id 없이 필요한 필드만 담긴 객체 배열이 반환됩니다.

[
    {
        "StudentFirstName" : "Chris",
        "StudentAge" : 21
    },
    {
        "StudentFirstName" : "Bob",
        "StudentAge" : 20
    },
    {
        "StudentFirstName" : "Sam",
        "StudentAge" : 19
    }
]

참고: 프로젝션(Projection)으로 더 간단하게 처리하기

필드 이름을 변경할 필요가 없고 단순히 _id만 제외하고 싶다면 find()의 두 번째 인자인 프로젝션 옵션을 사용하는 것이 훨씬 간단합니다.

> db.demo590.find({}, { _id: 0 })

여기서 _id: 0은 해당 필드를 결과에서 제외하겠다는 의미이며, 나머지 필드는 기본값인 1(포함)로 처리됩니다. 별도의 반복문 없이 한 번의 쿼리로 동일한 목적을 달성할 수 있으므로 성능 면에서도 유리합니다.

정리

지금까지 forEach()를 활용해 _id를 제외한 필드 값만 새로운 구조로 재구성하는 방법과, 프로젝션 옵션({ _id: 0 })으로 간단히 _id를 제외하는 방법을 살펴보았습니다. 필드명을 바꿔야 한다면 첫 번째 방법을, 단순히 _id만 숨기고 싶다면 프로젝션 방식을 선택하시면 됩니다.