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

Mongoose Aggregation filtrerer ikke efter inputdato

Mongoose har "skemaer", som den gør denne magiske ting kaldet "autocasting" for dig. Det typiske tilfælde, som designeren(erne) har i tankerne her, er, at alt input fra "web"-interaktioner som GET og POST er dybest set indeholdt i en "streng".

Uanset om der er en hjælper, der gør parametre til objekter med nøgler og værdier, er alle disse "værdier" stadig "strenge", eller muligvis lavet direkte numeriske af de samme "hjælpere", hvor det er relevant. Dette er almindeligt webrammedesign.

Så når du udsteder en .find() , denne funktion er fuldstændig ude af stand at ændre det returnerede indhold på anden måde end ved udeladelse af felter/egenskaber, så derfor anvendes "skemaet".

.aggregate() metode er helt forskellige. Hele dens eksistens er at modificere indhold indeholdt i dokumenter og samlinger. Konsekvensen af ​​dette er, at det er "umuligt" for et skema at anvende.

Derfor er "autocasting" til stede i metoder som .find() sker ikke , og du skal selv caste elementer (såsom "strengen" din "dato" bliver sendt i som ) til de korrekte typer:

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

Selvom alt du gør er en $match og at du ikke har "modificeret" skemaet på nogen måde, "antager" mongoose ikke dette og forsøger ikke at caste til det matchende felt i skemaet.

Logikken her er, at en $match scene eller noget lignende, der kunne være bundet til en "type", kunne forekomme hvor som helst i rørledningen. Som sådan er der ingen garanti for, at de dokumenter, der behandles af et pipeline-stadium, har nogen lighed med det oprindelige indsamlingsskema.

Formentlig "kunne" overveje eventuelt det faktum, at dette er det første rørledningstrin, hvor intet muligvis kunne have ændret sig, og lav en lignende inspektion. Men det er ikke sådan den nuværende kodebase fungerede.

Så kort sagt, når du bruger aggregeringspipelinen, skal alle objekter, der specifikt skal castes til en type (Date, ObjectId, osv.), "manuelt" castes i din kode, i stedet for at antage, at mongoose vil gøre det for dig ligesom i andre metoder.




  1. MongoDB tændt med Docker kunne ikke oprette forbindelse til serveren [localhost:27017] ved første forbindelse

  2. mongoose _id felt kan ikke slettes

  3. Hvordan flytter man penge med MongoDB?

  4. MongoDB opdaterer et dokument, når det allerede eksisterer med ReactiveMongo