Tài liệu "mới nhất" của bạn sẽ luôn ở cuối mảng của bạn trừ khi bạn sửa đổi bằng cách nào đó. Việc thêm các mục vào mảng sẽ luôn đi đến "cuối" hoặc "nối" vào các mục hiện có khi được sử dụng với $push
hoặc được thêm vào bằng cách sử dụng các phương pháp thao tác mảng trong mã máy khách.
Chỉ các toán tử như $addToSet
hoặc sử dụng các công cụ sửa đổi một cách rõ ràng cho $push
hoạt động sẽ thay đổi điều này.
Như vậy, khi ở cuối một mảng, điều bạn thường muốn làm là sử dụng $slice
, với chỉ số âm để lấy các mục từ "cuối" của mảng:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Nếu bạn đã thực sự sửa đổi mảng như đã đề cập trước đó, trong đó ngày mới nhất không phải là phần tử cuối cùng trong mảng thì bạn nên sử dụng $sort
sửa đổi trên các bản cập nhật. Nói chung sẽ chỉ "lạc chỗ" nếu bạn yêu cầu $position
công cụ sửa đổi hoặc bạn đã sử dụng $addToSet
. $position
sẽ có chủ ý và bạn cũng không thể sắp xếp, nhưng bạn luôn có thể sắp xếp mảng sau $addToSet
hoạt động như thế này, đặt tất cả các ngày theo thứ tự mà không thay đổi bất kỳ nội dung nào khác của mảng:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Với mảng được sửa đổi giống nhau $slice
hoạt động áp dụng cho các truy vấn vì mảng hiện có thứ tự theo ngày.
Tuy nhiên, nếu ý định của bạn là để mảng trong tài liệu của bạn không theo thứ tự hoặc theo thứ tự khác mà bạn muốn, nhưng bạn cũng muốn lấy ngày mới nhất, thì bạn có thể sử dụng .aggregate()
tới $sort
và truy xuất $last
mục nhập mảng:
Model.aggregate(
[
{ "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
{ "$unwind": "$comments" },
{ "$sort": { "comments.date": 1 } },
{ "$group": {
"_id": "$_id",
"author": { "$first": "$author" },
"link": { "$first": "$link" },
"title": { "$first": "$title" },
"date": { "$first": "$date" },
"comments": { "$last": "$comments" }
}}
]
)
Lưu ý rằng khi sử dụng khung tổng hợp với mongoose, _id
"autocasting" xảy ra trong các truy vấn khác không xảy ra (đây là do thiết kế), vì vậy cần phải truyền tới một ObjectId
giá trị bản thân, nếu dữ liệu chưa có sẵn trong biểu mẫu đó và đã ở dạng chuỗi.
Đó là những cách bạn lấy phần tử cuối cùng (được sắp xếp theo cách rõ ràng) từ một mảng.