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 }