Mengembalikan jumlah nilai khusus kepada pengguna apabila pengguna log masuk
P粉470645222
P粉470645222 2024-03-22 12:45:30
0
1
573

Seperti tajuknya, saya cuba mendapatkan data khusus daripada pengguna apabila mereka log masuk dan mengagregat semua data dan kemudian mengembalikan data terkumpul. Saya cuba menggunakan fungsi $match tetapi tidak berjaya. Apa yang mengecewakan ialah saya berjaya mengembalikan semua data dalam tatasusunan objek. Lebih khusus lagi, kod berikut berjaya dijalankan dan mengembalikan pelbagai objek:

const runs = await Run.find({ user: req.user.id })

Tetapi kod ini tidak, ia mengembalikan tatasusunan kosong:

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' },
      }
    }
  ])

Saya tidak pasti mengapa ini berlaku. Perkara yang harus dikembalikan ialah tatasusunan dengan objek yang diisi dengan semua data agregat di dalamnya.

Saya juga tahu bahawa jika anda mengalih keluar $match ia akan berjaya mengagregatkan semua data dalam koleksi yang sedang berjalan, jadi saya fikir ia ada kaitan dengannya.

Ini semua kod yang berkaitan:

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

membalas semua(1)
P粉722409996

Jadi dengan bantuan rickhg12hs kami dapat menentukan {match: { user : req.user.id } } bahawa saya cuba membandingkan rentetan dengan ObjectId, yang tidak berfungsi. Ini kerana API yang saya sediakan mengembalikan ID pengguna sebagai rentetan, bukan sebagai ObjectID. Untuk memastikan anda membandingkan jenis nilai yang betul (ObjectID dalam kes ini), anda boleh melakukan ini:

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

Ia mengambil rentetan yang dikembalikan dan menukarnya kepada ObjectID baharu, dan memandangkan ia kini membandingkan ObjectID, ia berfungsi.

Rupa-rupanya, dah ada dalam docs, cuma saya tak tengok betul-betul

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan