MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

L'aggregazione Mongoose non filtra per data di input

Mongoose ha "schemi" per i quali fa questa cosa magica chiamata "autocasting" per te. Il caso tipico che i designer hanno in mente qui è che tutti gli input provenienti da interazioni "web" come GET e POST è fondamentalmente contenuto in una "stringa".

Indipendentemente dal fatto che esista o meno un helper che trasforma i parametri in oggetti con chiavi e valori, tutti quei "valori" sono ancora "stringhe", o eventualmente resi direttamente numerici dagli stessi "helper" ove appropriato. Questo è il design di un framework web comune.

Quindi, quando emetti un .find() , questa funzione è completamente incapace di alterare il contenuto restituito in modo diverso dall'omissione di campi/proprietà, quindi viene applicato lo "schema".

Il .aggregate() il metodo è interamente diverso. La sua intera esistenza è da modificare contenuto contenuto in documenti e raccolte. La conseguenza di ciò è che è "impossibile" applicare uno schema.

Quindi, l'"autocasting" presente in metodi come .find() non succede e ti viene richiesto di trasmettere elementi (come la "stringa" in cui viene inviata la tua "data" come ) ai tipi corretti tu stesso:

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

Anche se tutto ciò che stai facendo è una $match e che non hai "modificato" lo schema in alcun modo, mongoose non "presume" questo e non tenta di eseguire il cast nel campo corrispondente nello schema.

La logica qui è che un $match fase o qualcosa di simile che potrebbe essere legato a un "tipo", potrebbe verificarsi in qualsiasi punto della pipeline. Pertanto, non vi è alcuna garanzia che i documenti su cui si agisce in una fase di pipeline abbiano alcuna somiglianza con lo schema di raccolta originale.

Probabilmente "potrebbe" possibilmente considera il fatto che questo è la prima fase del gasdotto in cui nulla potrebbe essere cambiato e fare un'ispezione simile. Ma non è così che funzionava l'attuale base di codice.

Quindi, in breve, quando si utilizza la pipeline di aggregazione, tutti gli oggetti che devono essere specificati in un tipo ( Date, ObjectId, ecc ) devono essere cast "manualmente" nel codice, piuttosto che presumere che mongoose lo farà per te come in altri metodi.