如標(biāo)題所示,我試圖在用戶登入時(shí)從用戶那裡獲取特定數(shù)據(jù)並聚合所有數(shù)據(jù),然後返回聚合數(shù)據(jù)。我嘗試使用 $match
函數(shù),但沒有運(yùn)氣。令人沮喪的是我能夠成功返回物件數(shù)組中的所有資料。更具體地說,下面的程式碼成功運(yùn)行並傳回一個(gè)物件數(shù)組:
const runs = await Run.find({ user: req.user.id })
但是此程式碼沒有,它會(huì)傳回一個(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' }, } } ])
我不確定為什麼會(huì)發(fā)生這種情況。它應(yīng)該傳回的是一個(gè)帶有物件的數(shù)組,該物件填充了其中的所有聚合資料。
我還知道,如果刪除 $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) } }
它會(huì)取得傳回的字串並將其轉(zhuǎn)換為新的 ObjectID,並且因?yàn)樗F(xiàn)在正在比較 ObjectID,所以它可以工作。
顯然,它一直在文檔中,我只是沒有'看起來還不夠仔細(xì)