MongoDB 4.4 đã giới thiệu $first
nhà điều hành đường ống tổng hợp.
Toán tử này trả về phần tử đầu tiên 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 ta có thể sử dụng $first
để trả về phần tử đầu tiên của mỗi mảng đó.
Ví dụ:
db.players.aggregate([
{
$project: {
"firstScore": {
$first: "$scores"
}
}
}
])
Kết quả:
{ "_id" : 1, "firstScore" : 1 } { "_id" : 2, "firstScore" : 8 } { "_id" : 3, "firstScore" : 15 }
Chúng ta có thể thấy rằng phần tử đầu tiên 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ị bằng 0 (0
):
db.players.aggregate([
{
$project: {
"firstScore": { $arrayElemAt: [ "$scores", 0 ] }
}
}
])
Mảng trống
Nếu bạn cung cấp một mảng trống, $first
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: {
"firstScore": {
$first: "$scores"
}
}
}
])
Kết quả:
{ "_id" : 1, "firstScore" : 1 } { "_id" : 2, "firstScore" : 8 } { "_id" : 3, "firstScore" : 15 } { "_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. Trên thực tế, nó thậm chí không trả về tên trường.
Giá trị rỗng và thiếu
Nếu toán hạng là null hoặc bị thiếu, $first
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: {
"firstScore": {
$first: "$scores"
}
}
}
])
Kết quả:
{ "_id" : 1, "firstScore" : 1 } { "_id" : 2, "firstScore" : 8 } { "_id" : 3, "firstScore" : 15 } { "_id" : 4 } { "_id" : 5, "firstScore" : 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 $first
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 $first
chống lại player
trường (không phải là một mảng):
db.players.aggregate([
{
$project: {
"firstPlayer": {
$first: "$player"
}
}
}
])
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$first'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.