Trong MongoDB, $arrayElemAt
toán tử đường ống tổng hợp trả về phần tử tại chỉ mục mảng được chỉ định.
Nó chấp nhận hai đối số;
- Mảng
- Chỉ mục của phần tử bạn muốn truy xuất
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là posts
với tài liệu sau:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Trong tài liệu này, các thẻ tags
trường chứa một mảng.
Chúng ta có thể sử dụng $arrayElemAt
toán tử để trả về một phần tử mảng tại một chỉ mục cụ thể.
Ví dụ:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 0 ] }
}
}
])
Kết quả:
{ "_id" : 1, "tag" : "html" }
Trong trường hợp này, chúng tôi trả về phần tử mảng đầu tiên. Mảng dựa trên 0 và vì vậy 0
tham chiếu đến phần tử đầu tiên trong mảng.
Mẹo:Từ MongoDB 4.4, chúng tôi cũng có thể sử dụng $first
toán tử để trả về phần tử đầu tiên trong một mảng.
Dưới đây là một ví dụ về cách lấy phần tử thứ hai:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", 1 ] }
}
}
])
Kết quả:
{ "_id" : 1, "tag" : "css" }
Giá trị phủ định cho chỉ mục
Bạn có thể cung cấp giá trị âm cho đối số thứ hai. Khi bạn làm điều này, $arrayElemAt
đếm ngược từ cuối mảng.
Ví dụ:
db.posts.aggregate([
{
$project: {
"tag": { $arrayElemAt: [ "$tags", -1 ] }
}
}
])
Kết quả:
{ "_id" : 1, "tag" : "xml" }
Trong trường hợp này, chúng tôi nhận được phần tử cuối cùng trong mảng.
Từ MongoDB 4.4, chúng ta cũng có thể sử dụng $last
toán tử để lấy phần tử mảng cuối cùng.
Kết hợp với các nhà khai thác khác
Bạn có thể sử dụng $arrayElemAt
với các toán tử khác để tạo ra kết quả bạn yêu cầu.
Dưới đây là một ví dụ về việc kết hợp nó với $binarySize
toán tử để trả về kích thước của một phần tử mảng cụ thể.
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Kết quả:
{ "_id" : 1, "tagsSize" : 4 }