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

MongoDB에서 쿼리 조건과 정확히 동일한 배열 항목을 가진 문서를 찾는 방법

MongoDB에서 배열 필드가 쿼리에 지정된 항목들과 정확히 일치하는 문서를 찾으려면 $all 연산자를 사용하면 됩니다. 이 연산자는 지정된 모든 값이 배열 안에 포함되어 있는 문서만 반환합니다.

1. 샘플 컬렉션 생성하기

먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.

> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["C++","Java","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd69a5f57806ebf1256f12e")
}
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["MySQL","Java","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd69ac057806ebf1256f12f")
}
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["C#","Python","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd69ad457806ebf1256f130")
}
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["MySQL","C","MongoDB"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd69adf57806ebf1256f131")
}

위 명령을 실행하면 각각 다른 기술 과목 배열을 가진 4개의 문서가 컬렉션에 저장됩니다.

2. 전체 문서 조회하기

find() 메서드를 사용해 컬렉션의 모든 문서를 확인해 보겠습니다.

> db.findDocumentExactlySameInArrayDemo.find().pretty();

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

{
   "_id" : ObjectId("5cd69a5f57806ebf1256f12e"),
   "TechnicalSubjects" : [
      "C++",
      "Java",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd69ac057806ebf1256f12f"),
   "TechnicalSubjects" : [
      "MySQL",
      "Java",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd69ad457806ebf1256f130"),
   "TechnicalSubjects" : [
      "C#",
      "Python",
      "MongoDB"
   ]
}
{
   "_id" : ObjectId("5cd69adf57806ebf1256f131"),
   "TechnicalSubjects" : [
      "MySQL",
      "C",
      "MongoDB"
   ]
}

3. $all 연산자로 정확히 일치하는 배열 찾기

이제 쿼리에 지정한 배열 항목과 정확히 동일한 항목을 가진 문서를 찾는 쿼리입니다.

> db.findDocumentExactlySameInArrayDemo.find({"TechnicalSubjects": { "$all": ["MySQL","Java","MongoDB"] }});

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

{ "_id" : ObjectId("5cd69ac057806ebf1256f12f"), "TechnicalSubjects" : [ "MySQL", "Java", "MongoDB" ] }

$all 연산자의 동작 원리

$all 연산자는 쿼리에 나열된 모든 값이 배열 필드에 포함되어 있는지 검사합니다. 위 예제에서는 ["MySQL", "Java", "MongoDB"] 세 항목을 모두 포함한 문서가 하나뿐이므로 해당 문서만 결과로 반환됩니다.

참고로 $all은 배열 내 요소의 순서나 추가 요소의 존재 여부까지 완벽하게 일치시키려는 경우에는 적합하지 않습니다. 만약 배열의 순서와 개수까지 정확히 일치하는 문서를 찾아야 한다면, 배열 전체를 직접 비교하는 방식을 사용하는 것이 좋습니다.

> db.findDocumentExactlySameInArrayDemo.find({"TechnicalSubjects": ["MySQL","Java","MongoDB"]});

이처럼 상황에 따라 $all(포함 여부 검사)과 배열 전체 매칭(완전 일치 검사)을 구분해서 사용하면 원하는 결과를 정확하게 얻을 수 있습니다.