Maison  >  Questions et réponses  >  le corps du texte

Renvoie la valeur totale propre à l'utilisateur lorsque celui-ci est connecté

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粉470645222P粉470645222211 Il y a quelques jours538

répondre à tous(1)je répondrai

  • P粉722409996

    P粉7224099962024-03-23 10:52:36

    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

    répondre
    0
  • Annulerrépondre