Comme le titre l'indique, j'essaie d'obtenir des données spécifiques de l'utilisateur lorsqu'il est connecté, de regrouper toutes les données, puis de renvoyer les données agrégées. J'ai essayé d'utiliser la fonction $match
mais sans succès. Ce qui est frustrant, c'est que je parviens à renvoyer avec succès toutes les données du tableau d'objets. Plus précisément, le code suivant s'exécute avec succès et renvoie un tableau d'objets :
const runs = await Run.find({ user: req.user.id })
Mais ce code ne le fait pas, il renvoie un tableau vide :
const cumulativeTotals = await Run.aggregate([ { $match: { user: req.user.id } }, { $group: { _id: null, totalRunTime: { $sum: '$runTime' }, avgRunTime: { $avg: '$runTime' }, totalRunDistance: { $sum: '$runDistance' }, avgRunDistance: { $avg: '$runDistance' }, avgPace: { $avg: '$avgPace' }, totalHeartRate: { $avg: '$avgHeartRate' }, totalActiveCalories: { $sum: '$activeCalories' }, averageActiveCalories: { $avg: '$activeCalories' }, absoluteTotalCalories: { $sum: '$totalCalories' }, avgTotalCalories: { $avg: '$totalCalories' }, } } ])
Je ne sais pas pourquoi cela se produit. Ce qu'il devrait renvoyer est un tableau avec un objet rempli de toutes les données agrégées qu'il contient.
Je sais aussi que si vous supprimez $match
, toutes les données de la collection en cours seront agrégées, donc je pense que cela a quelque chose à voir avec cela.
Voici tous les codes pertinents :
const getRuns = asyncHandler(async (req, res) => { const runs = await Run.find({ user: req.user.id }) const cumulativeTotals = await Run.aggregate([ { $match: { user: req.user.id } }, { $group: { _id: null, totalRunTime: { $sum: '$runTime' }, avgRunTime: { $avg: '$runTime' }, totalRunDistance: { $sum: '$runDistance' }, avgRunDistance: { $avg: '$runDistance' }, avgPace: { $avg: '$avgPace' }, totalHeartRate: { $avg: '$avgHeartRate' }, totalActiveCalories: { $sum: '$activeCalories' }, averageActiveCalories: { $avg: '$activeCalories' }, absoluteTotalCalories: { $sum: '$totalCalories' }, avgTotalCalories: { $avg: '$totalCalories' }, } } ]) if (!runs) { res.status(400).json({ message: 'No Runs Found for This User' }) return } const response = { runs, cumulativeTotals } res.status(200).json(response) })
Ainsi, avec l'aide de rickhg12hs, nous avons pu déterminer
{match: { user : req.user.id } }
que j'essayais de comparer une chaîne à un ObjectId, ce qui ne fonctionnait pas. En effet, l'API que j'ai configurée renvoie l'ID utilisateur sous forme de chaîne et non sous forme d'ObjectID. Pour vous assurer que vous comparez le bon type de valeur (ObjectID dans ce cas), vous pouvez procéder comme suit :Il prend la chaîne renvoyée et la convertit en un nouvel ObjectID, et comme il compare maintenant les ObjectID, cela fonctionne.
Apparemment, cela a été dans la docs, je n'ai tout simplement pas regardé d'assez près