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.