MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose Aggregation ne filtre pas par date d'entrée

Mongoose a des "schémas" pour lesquels il fait cette chose magique appelée "diffusion automatique" pour vous. Le cas typique que les concepteurs ont à l'esprit ici est que toutes les entrées provenant d'interactions "web" comme GET et POST est essentiellement contenu dans une "chaîne".

Qu'il y ait ou non un assistant qui transforme les paramètres en objets avec des clés et des valeurs, toutes ces "valeurs" sont toujours des "chaînes", ou éventuellement rendues directement numériques par les mêmes "assistants", le cas échéant. Il s'agit d'une conception de framework Web courante.

Ainsi, lorsque vous émettez un .find() , cette fonction est complètement incapable de modifier le contenu renvoyé autrement que par omission pour les champs/propriétés, donc le "schéma" est appliqué.

Le .aggregate() la méthode est entièrement différent. Toute son existence est à modifier contenu contenu dans les documents et les collections. La conséquence en est qu'il est "impossible" qu'un schéma s'applique.

D'où le "casting automatique" présent dans des méthodes comme .find() ne se produit pas , et vous devez transtyper vous-même les éléments (tels que la "chaîne" dans laquelle votre "date" est envoyée en tant que ) vers les types corrects :

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

Même si tout ce que vous faites est un $match et que vous n'avez pas "modifié" le schéma de quelque manière que ce soit, la mangouste ne le "présume" pas et n'essaie pas de convertir le champ correspondant dans le schéma.

La logique ici est qu'un $match étape ou quelque chose de similaire qui pourrait être lié à un "type", pourrait se produire n'importe où dans le pipeline. En tant que tel, il n'y a aucune garantie que les documents traités par une étape de pipeline ressemblent au schéma de collecte d'origine.

Sans doute "pourrait" envisager éventuellement le fait que cela est la première étape du pipeline où rien n'aurait pu changer et faire une inspection similaire. Mais ce n'est pas ainsi que fonctionnait la base de code actuelle.

Donc, en bref, lors de l'utilisation du pipeline d'agrégation, tous les objets qui doivent être spécifiquement convertis en un type ( Date, ObjectId, etc ) doivent être transtypés "manuellement" dans votre code, plutôt que de supposer que la mangouste va le faire pour vous comme dans d'autres méthodes.