Mongoose ma „schematy”, dla których robi dla ciebie tę magiczną rzecz zwaną „autocastingiem”. Typowym przypadkiem, o którym mają na myśli projektanci, jest to, że wszystkie dane wejściowe z interakcji „sieciowych”, takich jak GET
i POST
jest zasadniczo zawarty w "ciągu".
Niezależnie od tego, czy istnieje jakiś pomocnik, który przekształca parametry w obiekty z kluczami i wartościami, wszystkie te „wartości” są nadal „łańcuchami” lub ewentualnie są bezpośrednio numerowane przez tych samych „pomocników” tam, gdzie jest to właściwe. Jest to typowy projekt frameworka internetowego.
Więc kiedy wydajesz .find()
, ta funkcja jest całkowicie niedostępna zmiany zwracanej treści w inny sposób niż przez pominięcie pól/właściwości, dlatego stosowany jest „schemat”.
.aggregate()
metoda jest całkowicie różne. Całe jego istnienie polega na modyfikowaniu treści zawarte w dokumentach i zbiorach. Konsekwencją tego jest to, że "niemożliwe" jest zastosowanie schematu.
Stąd "autocasting" obecny w metodach takich jak .find()
nie dzieje się , i musisz samodzielnie rzutować elementy (takie jak „ciąg”, w którym Twoja „data” jest wysyłana jako ) do odpowiednich typów:
Reservation.aggregate([
{ "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])
Nawet jeśli wszystko, co robisz, to $match
i że nie "zmodyfikowałeś" schematu w żaden sposób, mangusta nie "zakłada" tego i nie próbuje rzutować na pasujące pole w schemacie.
Logika jest taka, że $match
stage lub coś podobnego, co może być powiązane z „typem”, może wystąpić w dowolnym miejscu potoku. W związku z tym nie ma gwarancji, że dokumenty, na których działa etap potoku, będą w jakikolwiek sposób przypominać oryginalny schemat kolekcji.
Prawdopodobnie „może” prawdopodobnie rozważ fakt, że to jest pierwszy etap rurociągu, na którym nic nie mogło się zmienić i przeprowadzić podobną inspekcję. Ale tak nie działa obecna baza kodu.
Krótko mówiąc, podczas korzystania z potoku agregacji wszystkie obiekty, które muszą być specjalnie rzutowane na typ ( Date, ObjectId itp. ) muszą być rzutowane "ręcznie" w twoim kodzie, zamiast zakładać, że mangusta zrobi to za ciebie podobnie jak w innych metodach.