Heim > Fragen und Antworten > Hauptteil
Wie der Titel schon sagt, versuche ich, bestimmte Daten vom Benutzer zu erhalten, wenn er angemeldet ist, alle Daten zu aggregieren und dann die aggregierten Daten zurückzugeben. Ich habe versucht, die $match
-Funktion zu verwenden, aber kein Erfolg. Was frustrierend ist, ist, dass ich alle Daten im Objektarray erfolgreich zurückgeben kann. Genauer gesagt wird der folgende Code erfolgreich ausgeführt und gibt ein Array von Objekten zurück:
const runs = await Run.find({ user: req.user.id })
Aber dieser Code tut das nicht, er gibt ein leeres Array zurück:
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' }, } } ])
Ich bin mir nicht sicher, warum das passiert. Was zurückgegeben werden sollte, ist ein Array mit einem Objekt, das alle darin enthaltenen aggregierten Daten enthält.
Ich weiß auch, dass, wenn Sie $match
entfernen, alle Daten in der laufenden Sammlung erfolgreich aggregiert werden, also denke ich, dass das etwas damit zu tun hat.
Hier sind alle relevanten Codes:
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
因此,在 rickhg12hs 的帮助下,我们能够确定 {match: { user : req.user.id } }
是我试图将字符串与 ObjectId 进行比较,这是行不通的。这是因为我设置的 API 将用户 ID 作为字符串返回,而不是作为 ObjectID。为了确保您比较的是正确的值类型(在本例中为 ObjectID),您可以这样做:
{ $match: { user: new mongoose.Types.ObjectId(req.user.id) } }
它获取返回的字符串并将其转换为新的 ObjectID,并且因为它现在正在比较 ObjectID,所以它可以工作。
显然,它一直在文档中,我只是没有'看起来还不够仔细