MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để truy xuất đối tượng cuối cùng của mảng trong tài liệu nhúng trong Mongoose?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Chèn tệp json vào mongodb

  2. Sau khi nâng cấp PHP lên phiên bản 7, tại sao tôi không thể sử dụng trình điều khiển mongodb?

  3. khớp với các ký tự utf8 nhiềubyte trong biểu thức chính quy mongodb

  4. Spring Data Mongo - Làm thế nào để ánh xạ các thực thể POJO kế thừa?

  5. Trình điều khiển MongoDB-Java:Bắt ngoại lệ khi chèn không thành công