문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

필터(집계)

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 행동
  • 예제
  • 숫자 비교 기반 필터링
  • limit 필드 사용
  • 가능한 일치값보다 큰 제한
  • 문자열 동일성 일치 기반 필터링
  • 정규 표현식 일치 기반 필터링
$filter

지정된 조건을 바탕으로 반환할 배열의 하위 집합을 선택합니다. 조건과 일치하는 요소만 포함되어 있는 배열을 반환하며, 반환된 요소는 원래 순서대로 표시됩니다.

다음 환경에서 호스팅되는 배포에 $filter 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

$filter 의 구문은 다음과 같습니다:

{
$filter:
{
input: <array>,
as: <string>,
cond: <expression>,
limit: <number expression>
}
}
필드
사양
input
배열로 해석되는 표현식 입니다.
as
선택 사항. input 배열의 각 개별 요소를 나타내는 변수의 이름입니다. 이름을 지정하지 않으면 변수 이름은 기본적으로 this가 됩니다.
cond
요소를 출력 배열에 포함할지 여부를 결정하는 데 사용되는 부울 값으로 해석되는 표현식입니다. 표현식은 as에 지정된 변수 이름을 사용하여 input 배열의 각 요소를 개별적으로 참고합니다.
limit

선택 사항. $filter 가 반환하는 일치하는 배열 요소의 수를 제한하는 숫자 표현식입니다. 1 보다 작은 제한은 지정할 수 없습니다. 일치하는 배열 요소는 입력 배열에 나타나는 순서대로 반환됩니다.

지정된 limit 이 일치하는 배열 요소의 수보다 크면 $filter 는 일치하는 모든 배열 요소를 반환합니다. 제한이 null 인 경우 $filter 는 일치하는 모든 배열 요소를 반환합니다.

표현식에 대한 자세한 내용은 표현식 연산자를 참조하세요.

예제
결과
{
$filter: {
input: [ 1, "a", 2, null, 3.1, NumberLong(4), "5" ],
as: "num",
cond: { $isNumber: "$$num" }
}
}
[ 1, 2, 3.1, NumberLong(4) ]
{
$filter: {
input: [ 1, "a", 2, null, 3.1, NumberLong(4), "5" ],
as: "num",
cond: { $isNumber: "$$num" },
limit: 2
}
}
[ 1, 2 ]
{
$filter: {
input: [ 1, "a", 2, null, 3.1, NumberLong(4), "5" ],
as: "num",
cond: { $isNumber: "$$num" },
limit: { $add: [ 0, 1 ] }
}
}
[ 1 ]

컬렉션 sales에는 다음 문서가 있습니다.

db.sales.insertMany( [
{
_id: 0,
items: [
{ item_id: 43, quantity: 2, price: 10, name: "pen" },
{ item_id: 2, quantity: 1, price: 240, name: "briefcase" }
]
},
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110, name: "notebook" },
{ item_id: 103, quantity: 4, price: 5, name: "pen" },
{ item_id: 38, quantity: 1, price: 300, name: "printer" }
]
},
{
_id: 2,
items: [
{ item_id: 4, quantity: 1, price: 23, name: "paper" }
]
}
] )

다음 예제에서는 100보다 크거나 같은 price가 있는 문서만 포함하도록 items 배열을 필터링합니다.

db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $gte: [ "$$item.price", 100 ] }
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ]
},
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110, name: 'notebook' },
{ item_id: 38, quantity: 1, price: 300, name: 'printer' }
]
},
{ _id: 2, items: [] }
]

이 예제에서는 이전 예제의 sales 컬렉션을 사용합니다.

이 예제에서는 limit 필드를 사용하여 각 items 배열에 반환된 일치하는 요소 수를 지정합니다.

db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $gte: [ "$$item.price", 100 ] },
limit: 1
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ]
},
{
_id: 1,
items: [ { item_id: 23, quantity: 3, price: 110, name: 'notebook' } ]
},
{ _id: 2, items: [] }
]

이 예제에서는 이전 예제의 sales 컬렉션을 사용합니다.

이 예제에서는 반환될 수 있는 일치하는 요소의 수보다 큰 limit 필드 값을 사용합니다. 이 경우 limit은(는) 쿼리 결과에 영향을 주지 않으며 $gte 필터 조건과 일치하는 모든 문서를 반환합니다.

db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $gte: [ "$$item.price", 100] },
limit: 5
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 2, quantity: 1, price: 240, name: 'briefcase' } ]
},
{
_id: 1,
items: [
{ item_id: 23, quantity: 3, price: 110, name: 'notebook' },
{ item_id: 38, quantity: 1, price: 300, name: 'printer' }
]
},
{ _id: 2, items: [] }
]

이 예제에서는 이전 예제의 sales 컬렉션을 사용합니다.

name 값이 penitems의 애그리게이션 필터는 다음과 같습니다.

db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: { $eq: [ "$$item.name", "pen"] }
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ]
},
{
_id: 1,
items: [ { item_id: 103, quantity: 4, price: 5, name: 'pen' } ]
},
{ _id: 2, items: [] }
]

이 예제에서는 이전 예제의 sales 컬렉션을 사용합니다.

다음 애그리게이션은 $regexMatch을(를) 사용하여 p(으)로 시작하는 name 값이 있는 items을(를) 필터링합니다.

db.sales.aggregate( [
{
$project: {
items: {
$filter: {
input: "$items",
as: "item",
cond: {
$regexMatch: { input: "$$item.name", regex: /^p/ }
}
}
}
}
}
] )
[
{
_id: 0,
items: [ { item_id: 43, quantity: 2, price: 10, name: 'pen' } ]
},
{
_id: 1,
items: [
{ item_id: 103, quantity: 4, price: 5, name: 'pen' },
{ item_id: 38, quantity: 1, price: 300, name: 'printer' }
]
},
{
_id: 2,
items: [ { item_id: 4, quantity: 1, price: 23, name: 'paper' } ]
}
]
← expMovingAvg (집계)