MongoDB 4.4 đã giới thiệu $last
nhà điều hành đường ống tổng hợp.
Toán tử này trả về phần tử cuối cùng trong một mảng.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là trình phát với các tài liệu sau:
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 5, 3 ] } { "_id" : 2, "player" : "Marge", "scores" : [ 8, 17, 18 ] } { "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8 ] }
Chúng ta có thể thấy rằng mỗi tài liệu có scores
trường có chứa một mảng.
Chúng tôi có thể sử dụng $last
để trả về phần tử cuối cùng của mỗi mảng đó.
Ví dụ:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Kết quả:
{ "_id" : 1, "lastScore" : 3 } { "_id" : 2, "lastScore" : 18 } { "_id" : 3, "lastScore" : 8 }
Chúng ta có thể thấy rằng phần tử cuối cùng của mảng đã được trả về cho mỗi tài liệu.
Điều này tương đương với việc sử dụng $arrayElemAt
toán tử có giá trị -1
:
db.players.aggregate([
{
$project: {
"firstScore": { $arrayElemAt: [ "$scores", -1 ] }
}
}
])
Mảng trống
Nếu bạn cung cấp một mảng trống, $last
sẽ không trả về giá trị.
Giả sử chúng ta chèn tài liệu sau vào bộ sưu tập của mình:
{ "_id" : 4, "player" : "Farnsworth", "scores" : [ ] }
Hãy chạy lại mã:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Kết quả:
{ "_id" : 1, "lastScore" : 3 } { "_id" : 2, "lastScore" : 18 } { "_id" : 3, "lastScore" : 8 } { "_id" : 4 }
Trong trường hợp này, tài liệu 4 không trả về bất kỳ giá trị nào cho mảng. Nó thậm chí không trả lại tên trường.
Giá trị rỗng và thiếu
Nếu toán hạng là null hoặc bị thiếu, $last
trả về null
.
Giả sử chúng ta chèn tài liệu sau:
{ "_id" : 5, "player" : "Meg", "scores" : null }
Hãy chạy lại mã:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Kết quả:
{ "_id" : 1, "lastScore" : 3 } { "_id" : 2, "lastScore" : 18 } { "_id" : 3, "lastScore" : 8 } { "_id" : 4 } { "_id" : 5, "lastScore" : null }
Lần này, nó trả về trường có giá trị là null
.
Toán hạng không hợp lệ
Toán hạng cho $last
phải giải quyết một mảng, null hoặc bị thiếu. Cung cấp toán hạng không hợp lệ dẫn đến lỗi.
Để chứng minh điều này, hãy thử sử dụng $last
chống lại player
trường (không phải là một mảng):
db.players.aggregate([
{
$project: {
"lastPlayer": {
$last: "$player"
}
}
}
])
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$last's argument must be an array, but is string", "code" : 28689, "codeName" : "Location28689" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Như mong đợi, nó trả về một lỗi.