MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

A agregação do Mongoose não filtra por data de entrada


O Mongoose tem "esquemas" para os quais ele faz essa coisa mágica chamada "autocasting" para você. O caso típico que os designers têm em mente aqui é que todas as entradas de interações "web" como GET e POST está basicamente contido em uma "string".

Se existe ou não algum auxiliar que transforma parâmetros em objetos com chaves e valores, todos esses "valores" ainda são "strings", ou possivelmente tornados diretamente numéricos pelos mesmos "auxiliares" quando apropriado. Este é o design de estrutura da web comum.

Então, quando você emite um .find() , esta função é completamente incapaz de alterar o conteúdo retornado que não seja por omissão para campos/propriedades, portanto, o "esquema" é aplicado.

O .aggregate() método é inteiramente diferente. Toda a sua existência é modificar conteúdo contido em documentos e coleções. A consequência disso é que é "impossível" aplicar um esquema.

Portanto, o "autocasting" presente em métodos como .find() não acontece , e você deve converter elementos (como a "string" em que sua "data" está sendo enviada como ) para os tipos corretos:
Reservation.aggregate([
   { "$match": { "createdAt": { "$lte": new Date(req.endDate) } } }
])

Mesmo que tudo o que você esteja fazendo seja um $match e que você não "modificou" o esquema de forma alguma, o mangusto não "pretende" isso e não tenta converter para o campo correspondente no esquema.

A lógica aqui é que um $match stage ou qualquer coisa semelhante que possa ser vinculada a um "tipo", pode ocorrer em qualquer lugar dentro do pipeline. Como tal, não há garantia de que os documentos em ação por um estágio de pipeline tenham qualquer semelhança com o esquema de coleta original.

Provavelmente "poderia" possivelmente considere o fato de que este é a primeira fase do gasoduto onde nada poderia ter mudado e fazer uma inspeção semelhante. Mas não era assim que a base de código atual funcionava.

Resumindo, ao usar o pipeline de agregação, todos os objetos que precisam ser convertidos especificamente para um tipo ( Date, ObjectId, etc ) precisam ser convertidos "manualmente" em seu código, em vez de assumir que o mangusto fará isso por você como em outros métodos.