i have this aggregation and i need to show a new object with sum of the GroupScore in the same takeoff of every competition inside the typeGroup, it can be a new aggretation or inside the same. (EventId, HorseID and CompetitorID makes the ID of the TakeOff to be the same on all competitions) Thanks for helping me!
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",
},
},
},
},
]);
Okay i got it, here is the awnser:
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",
},
},
},
},
]);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.