Mongoose има „схеми“, за които прави това магическо нещо, наречено „автоматично предаване“ за вас. Типичният случай, който дизайнерът(ите) имат предвид тук, е, че всички данни от „уеб“ взаимодействия като GET
и POST
основно се съдържа в "низ".
Независимо дали има или не някакъв помощник, който превръща параметрите в обекти с ключове и стойности, всички тези „стойности“ все още са „низове“ или евентуално направени директно числови от същите „помощници“, където е подходящо. Това е общ дизайн на уеб рамка.
Така че, когато издадете .find()
, тази функция е напълно неработеща за промяна на върнатото съдържание, различно от пропускане на полета/свойства, така че "схемата" се прилага.
.aggregate()
метод еизцяло различно. Цялото му съществуване е за промяна съдържание, съдържащо се в документи и колекции. Последицата от това е, че е „невъзможно“ да се приложи схема.
Следователно „автокастингът“, присъстващ в методи като .find()
не става и от вас се изисква сами да преобразувате елементи (като „низът“, в който се изпраща вашата „дата“) към правилните типове:
Reservation.aggregate([
{ "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])
Дори ако всичко, което правите, е $match
и че не сте "променили" схемата по никакъв начин, mongoose не "предполага" това и не се опитва да прехвърли към съвпадащото поле в схемата.
Логиката тук е, че $match
етап или нещо подобно, което може да бъде обвързано с "тип", може да се появи навсякъде в тръбопровода. Поради това няма гаранция, че документите, върху които се действа от етап на конвейер, имат някаква прилика с оригиналната схема за събиране.
Вероятно "би могло" евентуално вземете под внимание факта, че това се първият етап на тръбопровода, където нищо не би могло да се промени, и направете подобна проверка. Но текущата кодова база не работи така.
Така че накратко, когато използвате тръбопровода за агрегиране, всички обекти, които трябва да бъдат специално преобразувани към тип (Date, ObjectId и т.н.), трябва да бъдат "ръчно" преобразувани във вашия код, вместо да се предполага, че mongoose ще го направи вместо вас както при други методи.