Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / / /

$slice (projection)

이 페이지의 내용

  • 정의
  • 구문
  • 행동
  • 예시
$slice

$slice 프로젝션 연산자는 쿼리 결과에서 반환할 배열의 요소 수를 지정합니다.

참고

명확화

$push 으로 업데이트 하는 동안 배열 의 크기를 제한하는 방법에 대한 자세한 내용은 $slice 수정자를 대신 참조하세요.

집계 연산자의 경우 $slice 집계 연산자를 대신 참조하세요.

$slice에는 다음 구문 형식 중 하나가 있습니다.

db.collection.find(
<query>,
{ <arrayField>: { $slice: <number> } }
);

or

db.collection.find(
<query>,
{ <arrayField>: { $slice: [ <number>, <number> ] } }
);
설명
$slice: <number>

<arrayField> 에서 반환할 요소 수를 지정합니다. <number>의 경우,

  • 첫 번째 n 개의 요소를 반환하려면 양수 n 을(를) 지정합니다.

  • 마지막 n 개의 요소를 반환하려면 음수 n 을(를) 지정합니다.

<number> 이(가) 배열 요소 수보다 크면 쿼리는 모든 배열 요소를 반환합니다.

$slice: [ <number to skip>, <number to return> ]

첫 번째 요소부터 시작하여 지정된 수의 요소를 건너뛴 후 <arrayField> 에서 반환할 요소의 수를 지정합니다. 두 요소를 모두 지정해야 합니다.

<number to skip>의 경우:

  • 배열 시작 부분에서 n 요소를 건너뛰려면 양수 n 을(를) 지정하십시오. 즉, 0번째 인덱스 위치입니다. 0부터 시작하는 배열 인덱스를 기준으로 1 두 번째 요소의 시작 위치 등을 나타냅니다. n 이(가) 배열 요소의 수보다 크면 쿼리는 <arrayField>에 대해 빈 배열을 반환합니다.

  • 배열의 시작 부분에서 뒤로 n 개의 요소를 건너뛰려면 음수 n 을(를) 지정합니다. 즉, 0번째 인덱스 위치 0부터 시작하는 배열 인덱스를 기준으로 (즉, 첫 번째 요소가 인덱스 0에 있음), -1 은(는) 마지막 요소의 시작 위치를 나타냅니다. 음수의 절대값이 배열 요소 수보다 큰 경우 시작 위치는 배열의 시작입니다.

<number to return> 의 경우 지정된 숫자를 건너뛴 후 시작하여 다음 n 개의 요소를 반환하려면 양수 n 을(를) 지정해야 합니다.

프로젝션이 포함 프로젝션의 일부일 때 중첩 문서에서 한 배열의 $slice 프로젝션은 중첩 문서의 다른 필드를 더 이상 반환하지 않습니다.

예를 들어,inventory size 필드가 포함된 문서가 있는 collection을 고려해 보십시오.

{ item: "socks", qty: 100, details: { colors: [ "blue", "red" ], sizes: [ "S", "M", "L"] } }

다음 작업은 colors 배열의 지정된 슬라이스만으로 _id 필드(기본값), qty 필드 및 details 필드를 프로젝션합니다.

db.inventory.find( { }, { qty: 1, "details.colors": { $slice: 1 } } )

즉, 이 작업은 다음 문서를 반환합니다.

{ "_id" : ObjectId("5ee92a6ec644acb6d13eedb1"), "qty" : 100, "details" : { "colors" : [ "blue" ] } }

$slice 프로젝션이 제외 프로젝션의 일부인 경우 작업은 중첩 문서의 다른 필드를 계속 반환합니다. 다음과 같은 프로젝션은 제외 프로젝션입니다. 프로젝션은 _id 필드 및 지정된 슬라이스 외부에 있는 colors 배열의 요소를 제외하고 다른 모든 필드를 반환합니다.

db.inventory.find( { }, { _id: 0, "details.colors": { $slice: 1 } } )
{ "item" : "socks", "qty" : 100, "details" : { "colors" : [ "blue" ], "sizes" : [ "S", "M", "L" ] } }

$slice 프로젝션 자체는 제외로 간주됩니다.

이전 버전에서는 $slice 프로젝션이 포함인지 제외인지에 관계없이 중첩된 문서의 다른 필드도 프로젝션에 포함되었습니다.

db.collection.find() 뷰 에 대한 작업은 $slice 투영 연산자를 지원하지 않습니다.

findfindAndModify $slice 프로젝션은 $ 프로젝션 표현식의 일부로 프로젝션 표현식을 포함할 수 없습니다.

예를 들어 다음 연산은 유효하지 않습니다.

db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )

이전 버전에서 MongoDB는 쿼리 조건과 일치하는 instock 배열의 첫 번째 요소 (instock.$)를 반환합니다. 즉, 위치 프로젝션 "instock.$" 이(가) 우선하고 $slice:1 은(는) 작동하지 않습니다. "instock.$": { $slice: 1 } 은(는) 다른 문서 필드를 제외하지 않습니다.

findfindAndModify 프로젝션은 배열의 $slice 및 배열에 포함된 필드를 모두 포함할 수 없습니다.

예를 들어 배열 필드 instock이 포함된 collection inventory 을 생각해 보겠습니다.

{ ..., instock: [ { warehouse: "A", qty: 35 }, { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ], ... }

Path collision 오류와 함께 다음 작업이 실패합니다.

db.inventory.find( {}, { "instock": { $slice: 1 }, "instock.warehouse": 0 } )

이전 버전에서 프로젝션은 두 프로젝션을 모두 적용하고 instock 배열의 첫 번째 요소($slice: 1)를 반환하지만 프로젝션된 요소에서 warehouse 필드를 억제합니다. MongoDB 4.4부터는 동일한 결과를 얻으려면 $project 로 구성된 db.collection.aggregate() 메서드를 사용하십시오.

다음도 참조하세요.

다음 문서를 사용하여 예시 collection posts 을 만듭니다.

db.posts.insertMany([
{
_id: 1,
title: "Bagels are not croissants.",
comments: [ { comment: "0. true" }, { comment: "1. croissants aren't bagels."} ]
},
{
_id: 2,
title: "Coffee please.",
comments: [ { comment: "0. fooey" }, { comment: "1. tea please" }, { comment: "2. iced coffee" }, { comment: "3. cappuccino" }, { comment: "4. whatever" } ]
}
])

다음 작업은 comments 배열의 $slice 프로젝션 연산자를 사용하여 처음 세 요소가 포함된 배열을 반환합니다. 배열의 요소가 세 개 미만인 경우 배열의 모든 요소가 반환됩니다.

db.posts.find( {}, { comments: { $slice: 3 } } )

이 작업은 다음 문서를 반환합니다.

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "0. fooey" }, { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" } ]
}

다음 연산은 comments 배열에 있는 $slice 프로젝션 연산자를 사용하여 마지막 요소 세 개가 있는 배열을 반환합니다. 배열의 요소가 세 개 미만인 경우 배열의 모든 요소가 반환됩니다.

db.posts.find( {}, { comments: { $slice: -3 } } )

이 작업은 다음 문서를 반환합니다.

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "0. true" }, { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" }, { "comment" : "4. whatever" } ]
}

다음 연산은 comments 배열에서 $slice 프로젝션 연산자를 사용하여 다음을 실행합니다.

  • 두 번째 요소가 시작점이 되도록 첫 번째 요소를 건너뜁니다.

  • 그런 다음 시작점에서 3개의 요소를 반환합니다.

건너뛰기 후 배열의 요소가 3개 미만이면 나머지 요소가 모두 반환됩니다.

db.posts.find( {}, { comments: { $slice: [ 1, 3 ] } } )

이 작업은 다음 문서를 반환합니다.

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "1. tea please" }, { "comment" : "2. iced coffee" }, { "comment" : "3. cappuccino" } ]
}

다음 연산은 comments 배열에서 $slice 프로젝션 연산자를 사용하여 다음을 실행합니다.

  • 마지막 요소가 시작점이 되도록 첫 번째 요소에서 뒤로 건너뜁니다.

  • 그런 다음 시작점에서 3개의 요소를 반환합니다.

건너뛰기 후 배열의 요소가 3개 미만인 경우 배열의 나머지 요소가 모두 반환됩니다.

db.posts.find( {}, { comments: { $slice: [ -1, 3 ] } } )

이 작업은 다음 문서를 반환합니다.

{
"_id" : 1,
"title" : "Bagels are not croissants.",
"comments" : [ { "comment" : "1. croissants aren't bagels." } ]
}
{
"_id" : 2,
"title" : "Coffee please.",
"comments" : [ { "comment" : "4. whatever" } ]
}

돌아가기

$elemMatch

이 페이지의 내용