MongoDB에서 배열 필드에 특정 값들이 포함되지 않은 문서를 조회하려면 $nin 연산자를 사용하면 됩니다. $nin은 'not in'의 약자로, 지정한 배열에 속하지 않는 값만 가진 문서를 필터링할 때 유용합니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo180.insertOne({"Scores":["80","90","110"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3988a69e4f06af551997fb")
}
> db.demo180.insertOne({"Scores":["110","70","60"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3988b79e4f06af551997fc")
}
> db.demo180.insertOne({"Scores":["40","70","1010"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3988cc9e4f06af551997fd")
}2. 전체 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 출력합니다.
> db.demo180.find();
위 명령어를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e3988a69e4f06af551997fb"), "Scores" : [ "80", "90", "110" ] }
{ "_id" : ObjectId("5e3988b79e4f06af551997fc"), "Scores" : [ "110", "70", "60" ] }
{ "_id" : ObjectId("5e3988cc9e4f06af551997fd"), "Scores" : [ "40", "70", "1010" ] }총 3개의 문서가 저장되어 있으며, 각 문서의 Scores 필드는 문자열 배열 형태로 되어 있습니다.
3. $nin 연산자로 조건에 맞는 문서 조회하기
이제 배열에 "110" 또는 "90" 값이 포함되지 않은 문서만 일치시키는 쿼리를 작성해 보겠습니다. aggregate() 파이프라인과 함께 $match, $nin을 조합하여 사용합니다.
> db.demo180.aggregate({ "$match": { "Scores": { "$nin": ["110","90"] } } }).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5e3988cc9e4f06af551997fd"),
"Scores" : [ "40", "70", "1010" ]
}결과 분석
출력 결과를 보면 첫 번째 문서(["80", "90", "110"])와 두 번째 문서(["110", "70", "60"])는 제외되고, 세 번째 문서(["40", "70", "1010"])만 반환된 것을 확인할 수 있습니다. 그 이유는 다음과 같습니다.
- 첫 번째 문서는
"90"과"110"을 모두 포함하고 있으므로 제외됩니다. - 두 번째 문서는
"110"을 포함하고 있으므로 제외됩니다. - 세 번째 문서는
"110"도"90"도 포함하지 않으므로 조건에 일치하여 반환됩니다.
참고로 MongoDB에서 $nin은 배열 필드에 적용될 때, 지정한 값 중 하나라도 포함되어 있으면 해당 문서를 제외합니다. 따라서 배열 요소 전체가 제외 목록에 없어야만 문서가 최종 결과에 포함됩니다.