Trong MongoDB, $slice
toán tử đường ống tổng hợp trả về một tập hợp con của một mảng.
Để sử dụng $slice
, bạn chỉ định số phần tử trả về từ mảng. Bạn cũng có thể chỉ định vị trí bắt đầu để lấy tập hợp con từ mảng.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là test
với tài liệu sau:
{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }
Chúng ta có thể sử dụng $slice
để lấy một tập hợp con từ mảng trong dữ liệu data
trường.
Số nguyên dương
Việc cung cấp một giá trị dương duy nhất xác định vị trí bắt đầu từ đầu mảng.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 3 ] }
}
}
]
)
Kết quả:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Trong trường hợp này, chúng tôi đã cung cấp một số dương 3
và ba phần tử đầu tiên được trả về từ mảng.
Số nguyên phủ định
Việc cung cấp một giá trị âm duy nhất xác định vị trí bắt đầu từ end của mảng.
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -3 ] }
}
}
]
)
Kết quả:
{ "result" : [ "Horse", "Gorilla", "Zebra" ] }
Trong trường hợp này, chúng tôi trả về ba phần tử cuối cùng từ mảng.
Lưu ý rằng bạn không thể chỉ định số nguyên âm khi bạn cũng chỉ định vị trí bắt đầu. Tìm hiểu thêm về điều này sau.
Chỉ định vị trí bắt đầu
Bạn cũng có tùy chọn chỉ định vị trí bắt đầu. Để thực hiện việc này, hãy cung cấp một số nguyên khác trước số còn lại.
Số nguyên dương
Dưới đây là một ví dụ về việc sử dụng một số nguyên dương cho vị trí bắt đầu:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 2, 3 ] }
}
}
]
)
Kết quả:
{ "result" : [ "Cat", "Dog", "Horse" ] }
Trong trường hợp này, chúng tôi đã chỉ định vị trí bắt đầu của 2
và kích thước lát cắt là 3
.
Lưu ý rằng mảng dựa trên số 0 và do đó, số nguyên dương của chúng ta là 2
dẫn đến hoạt động lát bắt đầu ở vị trí thứ ba.
Số nguyên phủ định
Dưới đây là một ví dụ về việc sử dụng số nguyên âm cho vị trí bắt đầu:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -4, 3 ] }
}
}
]
)
Kết quả:
{ "result" : [ "Dog", "Horse", "Gorilla" ] }
Trong trường hợp này, chúng tôi đã chỉ định -4
, dẫn đến hoạt động lát đếm ngược lại bốn vị trí so với cuối.
Lát quá khổ
Việc cung cấp kích thước lát cắt lớn hơn các phần tử có sẵn trong mảng dẫn đến chỉ trả về các phần tử mảng còn lại.
Ví dụ:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -1, 3 ] }
}
}
]
)
Kết quả:
{ "result" : [ "Zebra" ] }
Ở đây, chúng tôi đã chỉ định rằng ba phần tử nên được trả về, mặc dù chúng tôi chỉ bắt đầu một vị trí trở lại từ cuối mảng. Trong trường hợp này, chỉ một phần tử được trả về (phần tử cuối cùng trong mảng).
Vị trí bắt đầu nằm ngoài phạm vi
Việc cung cấp vị trí bắt đầu nằm ngoài phạm vi của mảng có thể trả về một số phần tử hoặc một mảng trống. Tất cả phụ thuộc vào các giá trị được cung cấp.
Dưới đây là một ví dụ trả về một mảng trống:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 10, 3 ] }
}
}
]
)
Kết quả:
{ "result" : [ ] }
Điều này trả về một mảng trống vì vị trí bắt đầu là 10
, mặc dù chỉ có 7
các phần tử trong mảng (và số lượng sẽ đi từ 0
thành 6
).
Tuy nhiên, nếu chúng tôi cung cấp một giá trị âm lớn hơn kích thước mảng, thì lát cắt sẽ bắt đầu từ đầu mảng.
Ví dụ:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", -10, 3 ] }
}
}
]
)
Kết quả:
{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }
Lát phủ định với vị trí bắt đầu
Như đã đề cập, bạn không thể chỉ định số nguyên âm khi bạn cũng chỉ định vị trí bắt đầu. Làm điều này dẫn đến lỗi.
Ví dụ:
db.test.aggregate(
[
{
$project:
{
_id: 0,
result: { $slice: [ "$data", 4, -3 ] }
}
}
]
)
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "Third argument to $slice must be positive: -3", "code" : 28729, "codeName" : "Location28729" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1