Để thêm phần tử vào mảng và giới hạn kích thước (slice), sử dụng $push với $each và $slice. Tạo collection:
> db.demo656.insertOne({Name:"John"});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea060264deddd72997713cf") }
Hiển thị dữ liệu ban đầu:
> db.demo656.find();
Kết quả:
Lần 1: Push "John" vào mảng ListOfName, slice giữ 9 phần tử cuối (-9):
> db.demo656.update({Name:"John"}, {"$push":{"ListOfName": {"$each": ["John"], "$slice": -9}}}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })Kết quả:
> db.demo656.find(); { "_id" : ObjectId("5ea060264deddd72997713cf"), "Name" : "John", "ListOfName" : [ "John" ] }Lần 2: Push "David", slice -9 (giữ 9 phần tử cuối):
> db.demo656.update({Name:"John"}, {"$push":{"ListOfName": {"$each": ["David"], "$slice": -9}}}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })Kết quả mảng có 2 phần tử:
> db.demo656.find(); { "_id" : ObjectId("5ea060264deddd72997713cf"), "Name" : "John", "ListOfName" : [ "John", "David" ] }Giải thích cú pháp:
$each: [values]- cho phép push nhiều giá trị cùng lúc$slice: n- giữ n phần tử đầu (n>0) hoặc n phần tử cuối (n<0)$slice: -9- giữ tối đa 9 phần tử MỚI NHẤT (cú pháp log như stack/queue)
Ứng dụng: Giới hạn lịch sử hoạt động, log gần nhất, cache LRU. Kết hợp $sort để sắp xếp trước khi slice (MongoDB 3.6+).