[英]How to sum an aggregation on mongodb?
我有这个聚合,我需要显示一个新的 object 在 typeGroup 内每个比赛的同一次起飞中的 GroupScore 总和,它可以是一个新的聚合或同一个聚合。 (EventId、HorseID 和 CompetitorID 使 TakeOff 的 ID 在所有比赛中都相同)感谢您的帮助!
const takeOffs = await TakeOff.aggregate([
{
$lookup: {
from: Event.collection.name,
localField: "event",
foreignField: "_id",
as: "event",
},
},
{
$unwind: {
path: "$event",
preserveNullAndEmptyArrays: true,
},
},
{
$match: {
"event.typeGroup": mongoose.Types.ObjectId(req.params.id),
GroupPosition: {
$exists: true,
$ne: null,
},
GroupScore: {
$exists: true,
$ne: null,
},
},
},
{
$lookup: {
from: Competition.collection.name,
localField: "competition",
foreignField: "_id",
as: "competition",
},
},
{
$unwind: {
path: "$competition",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Competitor.collection.name,
localField: "competitor",
foreignField: "_id",
as: "competitor",
},
},
{
$unwind: {
path: "$competitor",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Horse.collection.name,
localField: "horse",
foreignField: "_id",
as: "horse",
},
},
{
$unwind: {
path: "$horse",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Category.collection.name,
localField: "competition.category",
foreignField: "_id",
as: "category",
},
},
{
$unwind: {
path: "$category",
preserveNullAndEmptyArrays: true,
},
},
{
$sort: {
"category.name": 1,
GroupPosition: 1,
},
},
{
$group: {
_id: {
competitionId: "$category.name",
eventId: "$event._id",
},
eventName: { $first: "$event.name" },
stage: { $first: "$event.stage" },
takeoffs: {
$push: {
_id: "$_id",
competitorName: "$competitor.name",
horseName: "$horse.name",
score: "$score",
GroupScore: "$GroupScore",
GroupPosition: "$GroupPosition",
},
},
},
},
{
$group: {
_id: "$_id.eventId",
eventName: { $first: "$eventName" },
stage: { $first: "$stage" },
competitions: {
$push: {
competition: "$_id.competitionId",
takeoffs: "$takeoffs",
},
},
},
},
{
$group: {
_id: "$_id.competitionId",
events: {
$push: {
_id: "$_id.event",
eventName: "$eventName",
stage: "$stage",
competitions: "$competitions",
},
},
},
},
]);
好的,我明白了,这是遮阳篷:
const takeOffs = await TakeOff.aggregate([
{
$lookup: {
from: Event.collection.name,
localField: "event",
foreignField: "_id",
as: "event",
},
},
{
$unwind: {
path: "$event",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Competition.collection.name,
localField: "competition",
foreignField: "_id",
as: "competition",
},
},
{
$unwind: {
path: "$competition",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Category.collection.name,
localField: "competition.category",
foreignField: "_id",
as: "category",
},
},
{
$unwind: {
path: "$category",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Competitor.collection.name,
localField: "competitor",
foreignField: "_id",
as: "competitor",
},
},
{
$unwind: {
path: "$competitor",
preserveNullAndEmptyArrays: true,
},
},
{
$lookup: {
from: Horse.collection.name,
localField: "horse",
foreignField: "_id",
as: "horse",
},
},
{
$unwind: {
path: "$horse",
preserveNullAndEmptyArrays: true,
},
},
{
$match: {
"event.typeGroup": mongoose.Types.ObjectId(req.params.id),
GroupPosition: {
$exists: true,
$ne: null,
},
GroupScore: {
$exists: true,
$ne: null,
},
},
},
{
$group: {
_id: {
competitionName: "$category.name",
competitorId: "$competitor._id",
horseName: "$horse._id",
},
competitor: { $first: "$competitor.name" },
horse: { $first: "$horse.name" },
TotalScore: { $sum: "$GroupScore" },
},
},
{
$group: {
_id: {
competitionName: "$_id.competitionName",
},
takeoffs: {
$push: {
competitor: "$competitor",
horse: "$horse",
TotalScore: "$TotalScore",
},
},
},
},
]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.