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

MongoDB에서 FirstName과 LastName 필드 조합으로 검색하는 쿼리 작성 방법

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로 필터링하는 방식도 널리 사용되므로 상황에 맞게 선택하면 좋습니다.