sql >> Database >  >> NoSQL >> MongoDB

Mongoose-aggregatie filtert niet op invoerdatum

Mongoose heeft "schema's" waarvoor het dit magische ding genaamd "autocasting" voor je doet. Het typische geval dat de ontwerper(s) hier in gedachten hebben, is dat alle invoer van "web"-interaties zoals GET en POST zit in feite in een "string".

Of er nu wel of niet een helper is die parameters in objecten met sleutels en waarden maakt, al die "waarden" zijn nog steeds "strings", of mogelijk direct numeriek gemaakt door dezelfde "helpers", waar van toepassing. Dit is een algemeen webframeworkontwerp.

Dus wanneer u een .find() . uitgeeft , deze functie is volledig ongeschikt van het wijzigen van de geretourneerde inhoud anders dan door weglating voor velden/eigenschappen, dus daarom wordt het "schema" toegepast.

De .aggregate() methode is helemaal verschillend. Het hele bestaan ​​is om aan te passen inhoud in documenten en collecties. Het gevolg hiervan is dat het "onmogelijk" is om een ​​schema toe te passen.

Vandaar de "autocasting" die aanwezig is in methoden zoals .find() gebeurt niet , en je bent verplicht om elementen ( zoals de "string" waarin je "date" wordt verzonden als ) zelf naar de juiste typen te casten:

Reservation.aggregate([
   { "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])

Zelfs als je alleen maar een $match doet en dat je het schema op geen enkele manier hebt "aangepast", mongoose "veronderstelt" dit niet en probeert niet naar het overeenkomende veld in het schema te casten.

De logica hier is dat een $match stage of iets dergelijks dat aan een "type" kan worden gebonden, kan overal in de pijplijn voorkomen. Als zodanig is er geen garantie dat de documenten waarop een pijplijnfase reageert, enige gelijkenis vertonen met het oorspronkelijke verzamelschema.

Ongetwijfeld "zou" mogelijk rekening houden met het feit dat dit is de eerste pijplijnfase waar niets had kunnen veranderen en doe een soortgelijke inspectie. Maar zo werkte de huidige codebasis niet.

Kortom, bij gebruik van de aggregatiepijplijn moeten alle objecten die specifiek naar een type (Datum, ObjectId, enz.) moeten worden gegoten, "handmatig" in uw code worden gegoten, in plaats van aan te nemen dat mangoest het voor u gaat doen zoals bij andere methoden.




  1. Mongoose, CastError:Cast to Array mislukt voor waarde bij het opslaan van een model dat een model bevat

  2. MongoDB Aggregate Framework - Groep per jaar

  3. Mongodb-caching van verzamelingsobjecten in Node.js

  4. Inleiding tot Apache HBase-snapshots