Mongoose có "lược đồ" mà nó thực hiện điều kỳ diệu này được gọi là "tự động định vị" cho bạn. Trường hợp điển hình mà (các) nhà thiết kế lưu ý ở đây là tất cả đầu vào từ các tương tác "web" như GET
và POST
về cơ bản được chứa trong một "chuỗi".
Cho dù có hay không một trình trợ giúp nào đó biến các tham số thành các đối tượng có khóa và giá trị, thì tất cả các "giá trị" đó vẫn là "chuỗi" hoặc có thể được tạo trực tiếp bằng số bởi cùng một "người trợ giúp" nếu thích hợp. Đây là thiết kế khung web phổ biến.
Vì vậy, khi bạn phát hành một .find()
, chức năng này hoàn toàn không có khả năng hoạt động thay đổi nội dung được trả về ngoài việc bỏ qua các trường / thuộc tính, do đó, "lược đồ" được áp dụng.
.aggregate()
phương pháp là hoàn toàn khác nhau. Toàn bộ sự tồn tại của nó là để sửa đổi nội dung có trong tài liệu và bộ sưu tập. Hệ quả của việc này là "không thể" áp dụng một lược đồ.
Do đó, "autocasting" có trong các phương thức như .find()
không xảy ra và bạn được yêu cầu truyền các phần tử (chẳng hạn như "chuỗi" "ngày" của bạn đang được gửi dưới dạng) cho chính mình các loại chính xác:
Reservation.aggregate([
{ "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])
Ngay cả khi tất cả những gì bạn đang làm là $match
và bạn đã không "sửa đổi" giản đồ theo bất kỳ cách nào, mongoose không "đoán trước" điều này và không cố gắng truyền đến trường phù hợp trong lược đồ.
Logic ở đây là $match
giai đoạn hoặc bất kỳ thứ gì tương tự có thể được liên kết với một "loại", có thể xảy ra ở bất kỳ đâu trong đường dẫn. Do đó, không có gì đảm bảo rằng các tài liệu đang được xử lý bởi một giai đoạn đường ống có bất kỳ sự tương đồng nào với lược đồ thu thập ban đầu.
Có thể cho rằng nó "có thể" có thể xem xét thực tế rằng đây là giai đoạn đường ống đầu tiên mà không có gì có thể có thể thay đổi và thực hiện một cuộc kiểm tra tương tự. Nhưng đó không phải là cách cơ sở mã hiện tại hoạt động.
Vì vậy, tóm lại, khi sử dụng đường ống tổng hợp, tất cả các đối tượng cần được truyền cụ thể đến một kiểu (Ngày tháng, ObjectId, v.v.) cần phải được truyền "thủ công" trong mã của bạn, thay vì giả sử mongoose sẽ làm điều đó cho bạn. giống như trong các phương pháp khác.