Mongoose má „schémata“, pro která za vás dělá tuto kouzelnou věc zvanou „autocasting“. Typický případ, který návrháři mají na mysli, je, že veškerý vstup z „webových“ interakcí jako GET
a POST
je v podstatě obsažen v "řetězci".
Ať už existuje nějaký pomocník, který dělá z parametrů objekty s klíči a hodnotami, nebo ne, všechny tyto „hodnoty“ jsou stále „řetězce“ nebo případně vytvořené přímo numericky stejnými „pomocníky“, kde je to vhodné. Toto je běžný návrh webového rámce.
Když tedy vydáte .find()
, tato funkce je zcela nefunkční změny vráceného obsahu jinak než vynecháním polí/vlastností, takže se použije "schéma".
.aggregate()
metoda je zcela odlišný. Celá jeho existence je upravovat obsah obsažený v dokumentech a sbírkách. Důsledkem toho je, že je „nemožné“, aby se schéma uplatnilo.
Proto "autocasting" přítomný v metodách jako .find()
nestane a musíte sami přenášet prvky (jako je „řetězec“, do kterého se vaše „datum“ odesílá jako ) do správných typů:
Reservation.aggregate([
{ "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])
I když vše, co děláte, je $match
a že jste schéma žádným způsobem "neupravili", mongoose to "nepředpokládá" a nepokouší se přetypovat na odpovídající pole ve schématu.
Logika je taková, že $match
fáze nebo cokoli podobného, co by mohlo být vázáno na "typ", se může vyskytnout kdekoli v potrubí. Jako takové neexistuje žádná záruka, že dokumenty, se kterými se pracuje ve fázi pipeline, budou mít jakoukoli podobnost s původním schématem sbírky.
Pravděpodobně to "mohlo" případně zvažte skutečnost, že toto je první etapa potrubí, kde se nemohlo nic změnit a provést podobnou kontrolu. Tak ale současná kódová základna nefungovala.
Stručně řečeno, při použití agregačního kanálu je třeba všechny objekty, které je třeba specificky přetypovat na typ (Datum, ObjectId atd.), přetypovat „ručně“ do vašeho kódu, spíše než předpokládat, že to za vás udělá mongoose. jako v jiných metodách.