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

MongoDB에서 $where 연산자로 숫자 키를 가진 객체의 값 검색하기

MongoDB에서 특정 값을 검색할 때는 $where 연산자를 사용하면 됩니다. 이 연산자는 JavaScript 함수를 실행하여 문서 단위로 조건을 평가할 수 있기 때문에, 필드 이름이 동적으로 정해져 있거나 숫자 형태의 키(예: "101", "1001")로 구성된 객체 내부의 값을 찾을 때 특히 유용합니다.

1. 테스트 컬렉션 생성

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo268.insertOne(
...   {
...     "details" : {
...        "101" : "John",
...        "1001" : "Bob"
...     }
...   }
...);
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e4816141627c0c63e7dbaaf")
}

위 문서는 details라는 하위 문서 안에 "101"과 "1001"이라는 숫자 형태의 키를 가지고 있습니다. 일반적인 쿼리 연산자로는 이런 가변적인 키 이름을 직접 지정하기 어렵기 때문에 $where가 유용한 상황입니다.

2. find() 메서드로 전체 문서 확인

삽입된 문서를 find() 메서드로 조회해 보겠습니다.

> db.demo268.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e4816141627c0c63e7dbaaf"), "details" : { "101" : "John", "1001" : "Bob" } }

3. $where를 사용한 값 검색 쿼리

이제 숫자 키를 가진 객체 내부에서 특정 값("Bob")을 검색하는 쿼리입니다. JavaScript의 for...in 반복문으로 모든 키를 순회하면서 값이 일치하는지 확인합니다.

> db.demo268.find({ $where:
...   function() {
...       for (var k in this.details) {
...          if (this.details[k] == "Bob") {
...             return true;
...          }
...       }
...   }
...})

쿼리 실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e4816141627c0c63e7dbaaf"), "details" : { "101" : "John", "1001" : "Bob" } }

4. 동작 원리 및 주의 사항

$where에 전달된 함수는 컬렉션의 각 문서마다 실행되며, 함수가 true를 반환하면 해당 문서가 결과에 포함됩니다. 위 예제에서는 this.details 객체의 모든 키를 순회하며 값이 "Bob"인 항목이 있는지 검사합니다.

다만 몇 가지 주의할 점이 있습니다.

  • 성능: $where는 인덱스를 활용할 수 없고 모든 문서에 대해 JavaScript를 실행하므로, 대량의 데이터에서는 속도가 느려질 수 있습니다.
  • 대안: 가능하다면 데이터 구조를 배열 형태로 설계하고 $elemMatch 같은 일반 쿼리 연산자를 사용하는 것이 더 효율적입니다.
  • 보안: 사용자 입력을 그대로 $where 문자열에 넣으면 코드 삽입 위험이 있으므로 주의해야 합니다.

이처럼 $where는 키 이름이 고정되어 있지 않은 유연한 문서 구조에서 값을 검색할 수 있는 강력한 도구이지만, 성능 특성을 고려해 적절한 상황에서 사용하는 것이 좋습니다.