Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách dùng $slice lấy phần tử cuối cùng của mảng trong MongoDB

Giới thiệu

Toán tử $slice trong projection cho phép lấy một phần (subset) của mảng. Với giá trị âm, nó lấy các phần tử từ cuối mảng.

Cú pháp

// Lấy N phần tử cuối
db.collection.find({}, { tenTruongMang: { $slice: -N } });

// Lấy N phần tử đầu
db.collection.find({}, { tenTruongMang: { $slice: N } });

// Lấy N phần tử bắt đầu từ vị trí skip
db.collection.find({}, { tenTruongMang: { $slice: [ skip, limit ] } });

Ví dụ minh họa: Lấy phần tử cuối (last element)

1. Tạo dữ liệu điểm thi

> db.layCuoiMang.insertOne({ "TenSinhVien": "James", "DiemToan": [78, 68, 98] });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d2d71a629b87623db1b2e") }
> db.layCuoiMang.insertOne({ "TenSinhVien": "Chris", "DiemToan": [88, 56, 34] });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d2d83a629b87623db1b2f") }
> db.layCuoiMang.insertOne({ "TenSinhVien": "Larry", "DiemToan": [99] });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d2d8ea629b87623db1b30") }
> db.layCuoiMang.insertOne({ "TenSinhVien": "Robert", "DiemToan": [90, 78, 67, 66, 75, 73] });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9d2dada629b87623db1b31") }

2. Lấy 1 phần tử cuối cùng ($slice: -1)

> db.layCuoiMang.find({}, { DiemToan: { $slice: -1 } });

3. Kết quả

{ "_id" : ObjectId("5c9d2d71a629b87623db1b2e"), "TenSinhVien" : "James", "DiemToan" : [ 98 ] }
{ "_id" : ObjectId("5c9d2d83a629b87623db1b2f"), "TenSinhVien" : "Chris", "DiemToan" : [ 34 ] }
{ "_id" : ObjectId("5c9d2d8ea629b87623db1b30"), "TenSinhVien" : "Larry", "DiemToan" : [ 99 ] }
{ "_id" : ObjectId("5c9d2dada629b87623db1b31"), "TenSinhVien" : "Robert", "DiemToan" : [ 73 ] }

Các biến thể $slice hữu ích

Cú phápKết quảVí dụ với [1,2,3,4,5]
{ $slice: 3 }3 phần tử đầu[1, 2, 3]
{ $slice: -3 }3 phần tử cuối[3, 4, 5]
{ $slice: [2, 3] }Bỏ 2 đầu, lấy 3 tiếp theo[3, 4, 5]
{ $slice: [-3, 2] }Từ 3 cuối, lấy 2[3, 4]

Lấy phần tử cuối cùng dạng giá trị thuần (không phải mảng)

Dùng aggregation $arrayElemAt:

db.collection.aggregate([
    { $project: { 
        phanTuCuoi: { $arrayElemAt: [ "$DiemToan", -1 ] } 
    } }
]);

Kết quả: { "phanTuCuoi": 98 } (số, không phải mảng)

Lưu ý

  • $slice trong find() chỉ dùng cho projection (field selection)
  • Trong aggregation, dùng $slice trong $project hoặc $addFields
  • $slice không thay đổi document gốc, chỉ ảnh hưởng kết quả trả về