Renvoie la valeur totale propre à l'utilisateur lorsque celui-ci est connecté
P粉470645222
P粉470645222 2024-03-22 12:45:30
0
1
595

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)
})

P粉470645222
P粉470645222

répondre à tous(1)
P粉722409996

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 :

{ $match: { user: new mongoose.Types.ObjectId(req.user.id) } }

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal