Tôi có thể đã viết ra điều này như một vài điều, nhưng xem xét "lấy lại các đối tượng mongoose" có vẻ là vấn đề chính.
Vì vậy, có nhiều điều bạn "có thể" làm. Nhưng vì bạn đang "điền các tham chiếu" vào một Đối tượng và sau đó muốn thay đổi thứ tự của các đối tượng trong một mảng nên thực sự chỉ có một cách để khắc phục điều này một lần và mãi mãi.
Sửa dữ liệu theo thứ tự khi bạn tạo nó
Nếu bạn muốn mảng "nhận xét" của mình được sắp xếp theo ngày chúng được "tạo_tạo", mảng này thậm chí còn được chia thành nhiều khả năng:
-
Nó "lẽ ra" phải được thêm vào theo thứ tự "insert", vì vậy "mới nhất" là cuối cùng như bạn lưu ý, nhưng bạn cũng có thể "sửa đổi" điều này trong các phiên bản MongoDB gần đây (vài năm trở lại đây) với
$position
làm công cụ sửa đổi cho$push
:Article.update( { "_id": articleId }, { "$push": { "comments": { "$each": [newComment], "$position": 0 } } }, function(err,result) { // other work in here } );
Điều này "thêm trước" phần tử mảng vào mảng hiện có ở chỉ mục "đầu tiên" (0) để nó luôn ở phía trước.
-
Không sử dụng cập nhật "vị trí" vì lý do hợp lý hoặc chỉ ở nơi bạn "muốn chắc chắn", thì đã có khoảng thời gian "lâu hơn" thậm chí là "lâu hơn"
$sort
sửa đổi thành$push
:Article.update( { "_id": articleId }, { "$push": { "comments": { "$each": [newComment], "$sort": { "$created_at": -1 } } } }, function(err,result) { // other work in here } );
Và điều đó sẽ "sắp xếp" trên thuộc tính của các tài liệu phần tử mảng có chứa giá trị được chỉ định trên mỗi sửa đổi. Bạn thậm chí có thể làm:
Article.update( { }, { "$push": { "comments": { "$each": [], "$sort": { "$created_at": -1 } } } }, { "multi": true }, function(err,result) { // other work in here } );
Và điều đó sẽ sắp xếp mọi mảng "nhận xét" trong toàn bộ bộ sưu tập của bạn theo trường được chỉ định trong một lần truy cập.
Các giải pháp khác có thể thực hiện được bằng cách sử dụng .aggregate()
để sắp xếp mảng và / hoặc "truyền lại" thành các đối tượng mongoose sau khi bạn thực hiện xong thao tác đó hoặc sau khi thực hiện .sort()
của riêng bạn trên đối tượng đơn giản.
Cả hai điều này thực sự liên quan đến việc tạo một đối tượng mô hình và "lược đồ" riêng biệt với các mục được nhúng bao gồm thông tin "được tham chiếu". Vì vậy, bạn có thể làm việc trên những dòng đó, nhưng nó có vẻ là không cần thiết khi bạn chỉ có thể sắp xếp dữ liệu cho mình theo nghĩa "cần thiết nhất" ngay từ đầu.
Thay thế là đảm bảo rằng các trường như "ảo" luôn "tuần tự hóa" thành định dạng đối tượng với .toObject()
trong cuộc gọi và chỉ sống với thực tế là tất cả các phương thức hiện đã biến mất và hoạt động với các thuộc tính như đã trình bày.
Cuối cùng là cách tiếp cận "lành mạnh", nhưng nếu những gì bạn thường sử dụng là thứ tự "create_at", thì việc "lưu trữ" dữ liệu của bạn theo cách đó sẽ có ý nghĩa hơn nhiều với mọi thao tác để khi bạn "truy xuất", dữ liệu đó sẽ nằm trong thứ tự mà bạn sẽ sử dụng.