본문 바로가기
데이터베이스/MongoDB

[MongoDB] 배열의 여러가지 Query 종류

by minhyeok.lee 2023. 3. 10.
반응형

배열의 여러가지 Query 종류 ( 배열과 일치, 요소에 대한 쿼리, 배열 요소에 대한 복합 필터 조건으로 쿼리, 여러 기준을 충족하는 배열 요소에 대한 쿼리, 인덱스 위치로 요소 쿼리, 배열 길이로 쿼리 )

 

 * MongoDB Shell에서 진행

아래와 같은 문서 내용을 삽입해준다.

db.inventory.insertMany([
   { _id: 1, item: "A", price: 25, colors: ["blank", "red"], diff: [ 14, 21 ] },
   { _id: 2, item: "B", price: 50, colors: ["red", "blank"], diff: [ 14, 21 ] },
   { _id: 3, item: "C", price: 100, colors: ["red", "blank", "plain"], diff: [ 14, 21 ] },
   { _id: 4, item: "D", price: 75, colors: ["blank", "red"], diff: [ 22.85, 30 ] },
   { _id: 5, item: "E", price: 45, colors: ["blue"], diff: [ 10, 15.25 ] }
]);

 

 

1. 배열과 일치

배열에 동등 조건을 지정하려면 쿼리 문서 { <field>: <value> }를 사용한다.

여기서 <value>는 요소의 순서를 포함하여 일치시킬 정확한 배열이다.

 

1-1)

다음 예제에서는 필드 값이 지정된 순서로 "red" 및 "blank"라는 정확히 두 개의 요소가 있는 배열인 모든 문서를 쿼리한다.

db.inventory.find( { colors: ["red", "blank"] } )

출력값

[
   { _id: 2, item: "B", price: 50, colors: ["red", "blank"], diff: [ 14, 21 ] }
]

 - colors: ["red", "blank"]인 _id: 2의 문서만 출력된다.

 

 

1-2)

배열의 순서나 다른 요소에 관계없이 "red" 및 "blank" 요소를 모두 포함하는 배열을 찾으려면 $all 연산자를 사용한다.

db.inventory.find( { colors: { $all: ["red", "blank"] } } )

출력값

[
   { _id: 1, item: "A", price: 25, colors: ["blank", "red"], diff: [ 14, 21 ] },
   { _id: 2, item: "B", price: 50, colors: ["red", "blank"], diff: [ 14, 21 ] },
   { _id: 3, item: "C", price: 100, colors: ["red", "blank", "plain"], diff: [ 14, 21 ] },
   { _id: 4, item: "D", price: 75, colors: ["blank", "red"], diff: [ 22.85, 30 ] }
]

 - colors: ["red", "blank"]가 포함된 문서들이 출력된다.

 

 

2. 요소에 대한 배열 쿼리

배열 필드에 지정된 값을 가진 요소가 하나 이상 포함되어 있는지 쿼리하려면 { <field>: <value> } 필터를 사용한다.

여기서 <value>는 요소 값이다.

 

배열 필드의 요소에 대한 조건을 지정하려면 쿼리 필터 문서에서 쿼리 연산자를 사용한다.

{ <array field>: { <operator1>: <value1>, ... } }

 

다음 예제는 colors가 요소 중 하나로 문자열 "red"를 포함하는 배열인 모든 문서를 쿼리한다.

db.inventory.find( { colors: "red" } )
db.inventory.find( { colors: { $eq: "red" } } )

출력값

[
   { _id: 1, item: "A", price: 25, colors: ["blank", "red"], diff: [ 14, 21 ] },
   { _id: 2, item: "B", price: 50, colors: ["red", "blank"], diff: [ 14, 21 ] },
   { _id: 3, item: "C", price: 100, colors: ["red", "blank", "plain"], diff: [ 14, 21 ] },
   { _id: 4, item: "D", price: 75, colors: ["blank", "red"], diff: [ 22.85, 30 ] },
]

 - colors: "red"가 포함된 문서들이 출력된다.

 

 

 

예를 들어 다음 작업은 diff 필드의 값이 25보다 큰 요소가 하나 이상 포함되어 있는 모든 문서를 쿼리한다.

db.inventory.find( { diff: { $gt: 25 } } )

출력값

[
   { _id: 4, item: "D", price: 75, colors: ["blank", "red"], diff: [ 22.85, 30 ] }
]

 -  diff 필드의 값이 25보다 큰 30이 있는 _id: 4의 문서만 출력된다.

 

배열 요소에 대한 여러 조건 지정

배열 요소에 복합 조건을 지정할 때

1) 배열 요소의 조합이 조건을 충족

2) 단일 배열 요소가 이러한 조건을 충족

할 수 있도록 쿼리를 지정할 수 있다.

 

 

3. 배열 요소에 대한 복합 필터 조건으로 배열 쿼리

다음 예제는 diff 필드의 일부 조합에서 쿼리 조건을 만족하는 요소를 포함하는 문서를 쿼리한다.

 

예를 들어 다음 작업은 diff 필드의 값이 15보다 크고 20보다 작은 요소가 있으면 된다.

db.inventory.find( { diff: { $gt: 15, $lt: 20 } } )

예를 들어,

1) 하나의 요소가 15보다 큰 조건을 충족하고 다른 요소가 20보다 작은 조건을 충족한다.

2) 단일 요소가 두 조건을 모두 충족할 수 있다.

 

출력값

[
   { _id: 1, item: "A", price: 25, colors: ["blank", "red"], diff: [ 14, 21 ] },
   { _id: 2, item: "B", price: 50, colors: ["red", "blank"], diff: [ 14, 21 ] },
   { _id: 3, item: "C", price: 100, colors: ["red", "blank", "plain"], diff: [ 14, 21 ] },
   { _id: 5, item: "E", price: 45, colors: ["blue"], diff: [ 10, 15.25 ] }
]

diff 필드의 값이 15보다 큰 요소가 하나라도 있고 20보다 작은 요소가 하나라도 있는 문서들이 출력된다.

 * _id: 4문서는 20보다 작은 값이 하나도 없기 때문에 조건에 부합하지 않는다.

 

 

4. 여러 기준을 충족하는 배열 요소에 대한 쿼리

$elemMatch 연산자를 사용하여 하나 이상의 배열 요소가 지정된 모든 기준을 충족하도록 배열 요소에 대한 여러 기준을 지정한다.

 

다음 예제는 diff 필드에 15보다 크고 20보다 작은 요소가 하나 이상 포함된 문서를 쿼리한다.

db.inventory.find( { diff: { $elemMatch: { $gt: 15, $lt: 20 } } } )

 출력값

[
   { _id: 5, item: "E", price: 45, colors: ["blue"], diff: [ 10, 15.25 ] }
]

diff 필드의 값이 15보다 크고 20보다 작은 요소가 하나라도 있는 문서 _id: 5의 문서가 출력된다. ( 15 < 15.25 < 20 )

 

 

5. 배열 인덱스 위치로 요소 쿼리

점 표기법을 사용하면 배열의 특정 인덱스 또는 위치에 있는 요소에 대한 쿼리 조건을 지정할 수 있다.

 - 배열은 0부터 시작하는 인덱싱을 사용한다.

 - 점 표기법을 사용하여 쿼리할 때 필드와 중첩 필드는 따옴표 안에 있어야 한다.

 

다음 예제는 diff 필드의 두 번째 요소가 25보다 큰 모든 문서를 쿼리한다.

db.inventory.find( { "diff.1": { $gt: 25 } } )

출력값

[
   { _id: 4, item: "D", price: 75, colors: ["blank", "red"], diff: [ 22.85, 30 ] }
]

diff 필드의 두 번째 요소가 25보다 큰 문서 _id: 4의 문서가 출력된다. ( 25 < 30 )

 

 

6. 배열 길이로 배열 쿼리

$size 연산자를 사용하여 요소 수로 배열을 쿼리한다.

 

예를 들어 다음은 배열 태그에 3개의 요소가 있는 문서를 선택한다.

db.inventory.find( { "colors": { $size: 3 } } )

출력값

[
   { _id: 3, item: "C", price: 100, colors: ["red", "blank", "plain"], diff: [ 14, 21 ] }
]
반응형

댓글