MongoDB에서 특정 문자열이 포함된 문서를 추출하려면 집계 파이프라인의 $match 연산자를 사용하면 됩니다. $match는 SQL의 WHERE 절과 유사한 역할을 하며, 지정한 조건과 일치하는 문서만 필터링해 줍니다.
이번 글에서는 예제 컬렉션을 만들고, $match를 활용해 배열 내부의 특정 이름(문자열)이 포함된 문서를 조회하는 방법을 단계별로 살펴보겠습니다.
1. 예제 컬렉션 생성하기
먼저 demo424라는 컬렉션에 문서를 삽입합니다. 각 문서는 Information이라는 배열 필드를 가지고 있으며, 배열 안에는 id와 Name으로 구성된 객체들이 들어 있습니다.
> db.demo424.insert(
... {
... "Information" : [
... {
... id:10,
... Name:"Chris"
... },
... {
... id:11,
... Name:"David"
... }
... ]
... }
... )
WriteResult({ "nInserted" : 1 })
>
> db.demo424.insert(
... {
... "Information" : [
... {
... id:101,
... Name:"Mike"
... },
... {
... id:102,
... Name:"John"
... }
... ]
... }
... )
WriteResult({ "nInserted" : 1 })두 개의 문서가 정상적으로 삽입되었습니다. WriteResult의 nInserted 값이 1이면 삽입이 성공했다는 의미입니다.
2. find() 메서드로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo424.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e74eb9dbbc41e36cc3cae6a"), "Information" : [ { "id" : 10, "Name" : "Chris" }, { "id" : 11, "Name" : "David" } ] }
{ "_id" : ObjectId("5e74eb9ebbc41e36cc3cae6b"), "Information" : [ { "id" : 101, "Name" : "Mike" }, { "id" : 102, "Name" : "John" } ] }현재 두 개의 문서가 저장되어 있으며, 각각 Chris·David 그리고 Mike·John이라는 이름을 포함하고 있습니다.
3. $match로 특정 문자열이 포함된 문서 추출하기
이제 aggregate()와 $match를 조합하여 Information.Name 값이 "Chris"인 문서만 추출해 보겠습니다. 배열 내부의 필드를 조회할 때는 점 표기법(dot notation)으로 경로를 지정합니다.
> db.demo424.aggregate(
... [ { $match : { "Information.Name": "Chris" } } ]
... );실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e74eb9dbbc41e36cc3cae6a"), "Information" : [ { "id" : 10, "Name" : "Chris" }, { "id" : 11, "Name" : "David" } ] }Name 필드 중 "Chris"를 포함하는 첫 번째 문서만 정확히 반환된 것을 확인할 수 있습니다. 배열 요소 중 하나라도 조건과 일치하면 해당 배열 전체가 포함된 문서가 결과로 나온다는 점을 기억해 두면 좋습니다.
마무리
이처럼 MongoDB에서는 $match 연산자와 점 표기법을 활용하면 배열 안에 중첩된 필드까지 손쉽게 검색할 수 있습니다. 단순 조회뿐 아니라 $group, $project 등 다른 집계 연산자와 함께 사용하면 더욱 강력한 데이터 처리가 가능하니, 실제 프로젝트에서 다양하게 응용해 보시기 바랍니다.