문서 메뉴

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

$slice (projection)

이 페이지의 내용

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

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

참고

명확화

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

애그리게이션 연산자의 경우 $slice 애그리게이션 연산자를 대신 참조하세요.

$slice 의 구문 형식은 다음 중 하나입니다.

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

또는

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 프로젝션 연산자를 사용하여 처음 세 개의 요소가 있는 배열을 반환합니다. 배열의 요소가 3개 미만인 경우 배열의 모든 요소가 반환됩니다.

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 프로젝션 연산자를 사용하여 마지막 3개 요소가 있는 배열을 반환합니다. 배열의 요소가 3개 미만인 경우 배열의 모든 요소가 반환됩니다.

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 (projection)

이 페이지의 내용