How to group mongoose results by status, and populate a reference field?

Viewed 14

I have a list of task records (see schema below). I am attempting to return records for a specific projectId, group my task records by status, and populate the responsible field. However, the responsible field is not populating. I have attached a code snippet below. Can anyone advise what I am doing incorrectly?

Code Snippet:

const test = await Task.aggregate([
        {
          $match: { project: { $eq: mongoose.Types.ObjectId(projectId) } },
        },
        {
          $group: {
            _id: "$status",
            data: {
              $push: {
                _id: "$status",
                name: "$name",
                responsible: "$responsible",
                endDate: "$endDate",
              },
            },
          },
        },
        {
          $sort: { status: 1 },
        },
      ]);
      console.log("test1:", test);

      // Populate Aggregated Data:
      const tasks = await User.populate(test, { path: "data.responsible" });
      console.log("test2:", tasks);

TaskSchema:

const TaskSchema = new mongoose.Schema({
    name: {
        type: String,
        trim: true,
        required: true,
      },
      responsible: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
      },
      endDate: {
        type: Date,
        required: false,
      },
      status: {
        type: String,
        enum: ["new", "active", "inactive", "closed"],
        required: true,
      },
      project: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Project",
      },
});

Desired Results:

results = [
    {
        _id: “new”
        data:   [
            {
                endDate: "2022-09-16T04:00:00.000Z”,

                name: "test1”,
                responsible: {
                    email: “jane.doe@ymail.com”,
                    firstName: “Jane”,
                    lastName: “Doe”
            },
            {
                endDate: "2022-09-16T04:00:00.000Z”,

                name: "test2”,
                responsible: {
                    email: “john.doe@ymail.com”,
                    firstName: “John”,
                    lastName: “Doe”
            },
        ]
    },  

]
0 Answers
Related