Rumah > Soal Jawab > teks badan
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粉7224099962024-03-23 10:52:36
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