$slice (projection)
정의
$slice
$slice
프로젝션 연산자는 쿼리 결과에서 반환할 배열의 요소 수를 지정합니다.
구문
$slice
에는 다음 구문 형식 중 하나가 있습니다.
db.collection.find( <query>, { <arrayField>: { $slice: <number> } } );
or
db.collection.find( <query>, { <arrayField>: { $slice: [ <number>, <number> ] } } );
값 | 설명 |
---|---|
$slice: <number> |
|
$slice: [ <number to skip>, <number to return> ] | 첫 번째 요소부터 시작하여 지정된 수의 요소를 건너뛴 후
|
행동
$slice
임베디드 배열
프로젝션이 포함 프로젝션의 일부일 때 중첩 문서에서 한 배열의 $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
투영 연산자를 지원하지 않습니다.
$
위치 $slice
연산자 및 제한
find
및 findAndModify
$slice
프로젝션은 $
프로젝션 표현식의 일부로 프로젝션 표현식을 포함할 수 없습니다.
예를 들어 다음 연산은 유효하지 않습니다.
db.inventory.find( { "instock.qty": { $gt: 25 } }, { "instock.$": { $slice: 1 } } )
이전 버전에서 MongoDB는 쿼리 조건과 일치하는 instock
배열의 첫 번째 요소 (instock.$
)를 반환합니다. 즉, 위치 프로젝션 "instock.$"
이(가) 우선하고 $slice:1
은(는) 작동하지 않습니다. "instock.$": {
$slice: 1 }
은(는) 다른 문서 필드를 제외하지 않습니다.
경로 충돌: $slice
배열 및 포함된 필드의
find
및 findAndModify
프로젝션은 배열의 $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" } ] } ])
처음 3개의 요소로 배열 반환하기
다음 작업은 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" } ] }
마지막 3개 요소로 배열 반환하기
다음 연산은 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" } ] }
첫 번째 요소를 건너뛴 후 3개의 요소가 있는 배열 반환하기
다음 연산은 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" } ] }
마지막 요소를 건너뛴 후 3개의 요소가 있는 배열 반환하기
다음 연산은 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" } ] }