正如標(biāo)題所示,我試圖在用戶登錄時(shí)從用戶那里獲取特定數(shù)據(jù)并聚合所有數(shù)據(jù),然后返回聚合數(shù)據(jù)。我嘗試使用 $match
函數(shù),但沒有運(yùn)氣。令人沮喪的是我能夠成功返回對象數(shù)組中的所有數(shù)據(jù)。更具體地說,下面的代碼成功運(yùn)行并返回一個(gè)對象數(shù)組:
const runs = await Run.find({ user: req.user.id })
但是此代碼沒有,它返回一個(gè)空數(shù)組:
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' }, } } ])
我不確定為什么會出現(xiàn)這種情況。它應(yīng)該返回的是一個(gè)帶有對象的數(shù)組,該對象填充了其中的所有聚合數(shù)據(jù)。
我還知道,如果刪除 $match
它將成功聚合運(yùn)行集合中的所有數(shù)據(jù),所以我認(rèn)為這與此有關(guān)。
以下是所有相關(guān)代碼:
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) })
因此,在 rickhg12hs 的幫助下,我們能夠確定 {match: { user : req.user.id } }
是我試圖將字符串與 ObjectId 進(jìn)行比較,這是行不通的。這是因?yàn)槲以O(shè)置的 API 將用戶 ID 作為字符串返回,而不是作為 ObjectID。為了確保您比較的是正確的值類型(在本例中為 ObjectID),您可以這樣做:
{ $match: { user: new mongoose.Types.ObjectId(req.user.id) } }
它獲取返回的字符串并將其轉(zhuǎn)換為新的 ObjectID,并且因?yàn)樗F(xiàn)在正在比較 ObjectID,所以它可以工作。
顯然,它一直在文檔中,我只是沒有'看起來還不夠仔細(xì)