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

MongoDB에서 배열의 항목 중 하나라도 다른 값에 없는 문서 찾는 방법

배열 필드에 저장된 항목 중 하나라도 특정 값 목록에 포함되지 않는 문서를 조회하려면, MongoDB의 find() 메서드와 함께 정규식(regex)을 활용하면 됩니다. 특히 부정형 전방 탐색(negative lookahead) 패턴을 사용하면 원하는 조건을 간단하게 구현할 수 있습니다.

1. 컬렉션 생성 및 문서 삽입

먼저 데모용 컬렉션을 생성하고 테스트 데이터를 삽입해 보겠습니다.

> db.demo228.insertOne({"Subjects":["MongoDB","Java"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3fa51f03d395bdc213473b")
}
> db.demo228.insertOne({"Subjects":["MongoDB","Java","MySQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3fa52c03d395bdc213473c")
}

위 명령은 두 개의 문서를 생성합니다. 첫 번째 문서의 Subjects 배열에는 MongoDB와 Java만 담겨 있고, 두 번째 문서에는 여기에 MySQL까지 추가로 포함되어 있습니다.

2. 전체 문서 조회

find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 확인합니다.

> db.demo228.find();

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

{ "_id" : ObjectId("5e3fa51f03d395bdc213473b"), "Subjects" : [ "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e3fa52c03d395bdc213473c"), "Subjects" : [ "MongoDB", "Java", "MySQL" ] }

3. 정규식으로 조건에 맞는 문서 찾기

이제 배열의 항목 중 하나라도 지정된 값(MongoDB, Java)에 해당하지 않는 문서를 찾는 쿼리입니다. 부정형 전방 탐색 패턴 /^(?!MongoDB|Java)/를 적용합니다.

> db.demo228.find({ "Subjects": /^(?!MongoDB|Java)/ });

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

{ "_id" : ObjectId("5e3fa52c03d395bdc213473c"), "Subjects" : [ "MongoDB", "Java", "MySQL" ] }

동작 원리 설명

정규식 /^(?!MongoDB|Java)/는 문자열 시작 위치에서 MongoDB 또는 Java로 시작하지 않는 값을 매칭합니다. MongoDB는 배열 필드에 정규식을 적용할 때 배열 내 각 요소를 개별적으로 검사하므로, 요소 중 하나라도 패턴과 일치하면 해당 문서가 결과에 포함됩니다.

따라서 첫 번째 문서의 Subjects 배열([MongoDB, Java])은 모든 요소가 제외 대상이라 매칭되지 않았고, 두 번째 문서의 MySQL 요소는 MongoDB나 Java로 시작하지 않기 때문에 조건에 부합하여 결과로 반환된 것입니다.