MongoDB에서 두 필드를 조합해 검색하기
MongoDB에서 FirstName과 LastName처럼 여러 개의 필드를 하나로 합쳐서 특정 값을 찾고 싶다면, 집계 파이프라인(aggregate)에서 $concat 연산자로 필드를 결합한 뒤 $eq 연산자로 일치 여부를 확인하면 됩니다.
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo502.insertOne({"FirstName":"John","LastName":"Smith"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e875534987b6e0e9d18f56d")
}
> db.demo502.insertOne({"FirstName":"David","LastName":"Miller"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e87553e987b6e0e9d18f56e")
}
> db.demo502.insertOne({"FirstName":"John","LastName":"Doe"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e875543987b6e0e9d18f56f")
}컬렉션의 모든 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 화면에 출력할 수 있습니다.
> db.demo502.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e875534987b6e0e9d18f56d"), "FirstName" : "John", "LastName" : "Smith"
}
{ "_id" : ObjectId("5e87553e987b6e0e9d18f56e"), "FirstName" : "David", "LastName" : "Miller"
}
{ "_id" : ObjectId("5e875543987b6e0e9d18f56f"), "FirstName" : "John", "LastName" : "Doe" }필드 조합으로 검색하는 쿼리
이제 $redact 단계와 함께 $cond, $eq, $concat을 활용하여 두 필드를 조합한 값이 "John Doe"와 일치하는 문서만 걸러내는 쿼리를 살펴보겠습니다.
> db.demo502.aggregate(
... [
... { "$redact": {
... "$cond": [
... { "$eq": [
... { "$concat": [ "$FirstName", " ", "$LastName" ] },
... "John Doe"
... ]},
... "$$KEEP",
... "$$PRUNE"
... ]
... }}
... ]
... )쿼리 실행 결과는 다음과 같습니다. FirstName과 LastName을 공백으로 연결한 값이 "John Doe"인 문서만 남게 됩니다.
{ "_id" : ObjectId("5e875543987b6e0e9d18f56f"), "FirstName" : "John", "LastName" : "Doe" }쿼리 동작 원리 정리
- $concat: FirstName과 LastName 사이에 공백(" ")을 넣어 하나의 문자열로 결합합니다.
- $eq: 결합된 문자열이 목표 값("John Doe")과 정확히 일치하는지 비교합니다.
- $cond: 조건이 참이면 "$$KEEP"을 반환하여 해당 문서를 유지하고, 거짓이면 "$$PRUNE"을 반환하여 제거합니다.
참고로 최신 MongoDB 버전에서는 $redact 대신 $match와 $expr을 조합하거나, $addFields로 결합 필드를 만든 뒤 $match로 필터링하는 방식도 널리 사용되므로 상황에 맞게 선택하면 좋습니다.