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

MongoDB: $in과 $nin을 조합하여 'MongoDB' 과목은 포함하되 'Java'는 제외한 문서 조회하기

MongoDB에서 $in과 $nin을 조합해 배열 필드 필터링하기

배열 필드에서 특정 값은 포함하면서 다른 특정 값은 배제한 문서를 조회하려면 $in 연산자와 $nin 연산자를 $and 연산자와 함께 사용하면 됩니다. $in은 주어진 값 중 하나라도 포함된 문서를 찾아내고, $nin은 주어진 값을 하나도 포함하지 않는 문서만 걸러냅니다. 두 조건을 결합하면 원하는 형태의 정확한 필터링이 가능합니다.

1단계: 샘플 컬렉션 생성

먼저 예제로 사용할 문서들이 담긴 컬렉션을 만들어 보겠습니다.

> db.demo140.insertOne({"Id":101,"Subjects":["MongoDB","MySQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c149fdf09dd6d08539a9")
}
> db.demo140.insertOne({"Id":102,"Subjects":["MongoDB","Java"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c14cfdf09dd6d08539aa")
}
> db.demo140.insertOne({"Id":103,"Subjects":["MongoDB","PL/SQL"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c157fdf09dd6d08539ab")
}
> db.demo140.insertOne({"Id":104,"Subjects":["MongoDB","SQL Server"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c163fdf09dd6d08539ac")
}
> db.demo140.insertOne({"Id":105,"Subjects":["C","C++"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e31c16ffdf09dd6d08539ad")
}

2단계: 전체 문서 확인하기

find() 메서드를 사용하여 컬렉션의 모든 문서를 출력해 봅니다.

> db.demo140.find();

위 명령은 다음과 같은 결과를 반환합니다.

{ "_id" : ObjectId("5e31c149fdf09dd6d08539a9"), "Id" : 101, "Subjects" : [ "MongoDB", "MySQL" ] }
{ "_id" : ObjectId("5e31c14cfdf09dd6d08539aa"), "Id" : 102, "Subjects" : [ "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e31c157fdf09dd6d08539ab"), "Id" : 103, "Subjects" : [ "MongoDB", "PL/SQL" ] }
{ "_id" : ObjectId("5e31c163fdf09dd6d08539ac"), "Id" : 104, "Subjects" : [ "MongoDB", "SQL Server" ] }
{ "_id" : ObjectId("5e31c16ffdf09dd6d08539ad"), "Id" : 105, "Subjects" : [ "C", "C++" ] }

3단계: 'MongoDB'는 포함하고 'Java'는 제외하는 쿼리 실행

다음은 Subjects 배열에 "MongoDB"는 포함되어 있지만 "Java"는 포함되지 않은 문서를 조회하는 쿼리입니다.

> db.demo140.find({$and:[{Subjects:{$in:['MongoDB']}}, {Subjects:{$nin:['Java']}}]}).toArray();

위 쿼리는 다음과 같은 결과를 출력합니다.

[
   {
       "_id" : ObjectId("5e31c149fdf09dd6d08539a9"),
       "Id" : 101,
       "Subjects" : [
           "MongoDB",
           "MySQL"
       ]
   },
   {
       "_id" : ObjectId("5e31c157fdf09dd6d08539ab"),
       "Id" : 103,
       "Subjects" : [
           "MongoDB",
           "PL/SQL"
       ]
   },
   {
       "_id" : ObjectId("5e31c163fdf09dd6d08539ac"),
       "Id" : 104,
       "Subjects" : [
           "MongoDB",
           "SQL Server"
       ]
   }
]

결과 분석

쿼리 실행 결과 Id가 101, 103, 104인 세 개의 문서가 반환되었습니다. Id 102 문서는 "MongoDB"를 포함하지만 "Java"도 함께 가지고 있어 $nin 조건에 의해 제외되었고, Id 105 문서는 "MongoDB" 자체가 없어 $in 조건에 맞지 않아 제외되었습니다. 이처럼 $and 내부에서 $in과 $nin을 조합하면 배열 필드에 대한 복잡한 포함/배제 조건도 간단하게 처리할 수 있습니다.