Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to add field in array with aggregate mongoose from another array coming from previous stage

I have two mongoose schema one for keywords :

const keywordSchema = new Schema<keywordI>(
  {
    sentence: { type: String, required: true },
    example: { type: String, required: true },
    translate: { type: String, required: true },
    imageUrl: { type: String, required: true },
    audioUrl: { type: String, required: true },
    deletedAt: { type: Date, select: false },
  },
  { timestamps: true }
);

and one for keywordsUser :

const keywordUserSchema = new Schema<keywordUserI>(
  {
    keywordId: {
      type: mongoose.Types.ObjectId,
      ref: "Keyword",
      required: true,
    },
    userId: {
      type: mongoose.Types.ObjectId,
      ref: "User",
      required: true,
    },
    isBookMarked: { type: Boolean, default: false },
    correctAnswer: { type: Number, default: 0 },
    wrongAnswer: { type: Number, default: 0 },
  },
  { timestamps: true }
);

I want to get keywords by user grouped by type which I calculate from wrongAnswer and correctAnswer

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I try to do this using aggregate

  return KeyWordUser.aggregate([
  {
    $match: { userId },
  },
  {
    $addFields: {
      type: {
        $function: {
          body: getType,
          args: ["$correctAnswer", "$wrongAnswer"],
          lang: "js",
        },
      },
    },
  },
  {
    $group: {
      _id: "$type",
      words: {
        $push: "$keywordId",
      },
      isBookMarked: {
        $push: { isBookMarked: "$isBookMarked", keywordId: "$keywordId" },
      },
    },
  },
  {
    $lookup: {
      localField: "words",
      from: "keywords",
      foreignField: "_id",
      as: "props",
    },
  },
  {
    $addFields: { type: "$_id" },
  },
  {
    $project: {
      _id: 0,
      words: 0,
    },
  },
]);

I have this result from aggregate

returned data from. postman

I want to add new aggregate stage to get this result

previous result

[
            {
                "isBookMarked": [
                    {
                        "keywordId": "62e2a0ad3113b8234511cd72"
                    },
                    {
                        "isBookMarked": false,
                        "keywordId": "62e2a0ba3113b8234511cd74"
                    }
                ],
                "props": [
                    {
                        "_id": "62e2a0ad3113b8234511cd72",
                        "sentence": "hello",
                        "example": "Hello , what's your name",
                        "translate": "مرحبا ما اسمك",
                        "imageUrl": "src/img/keywords/keyword-A7H_M-1659019437698.png",
                        "audioUrl": "src/audio/keywords/keyword-YyhUp-1659019437700.mpeg",
                        "createdAt": "2022-07-28T14:43:57.708Z",
                        "updatedAt": "2022-07-28T14:43:57.708Z",
                        "__v": 0
                    },
                    {
                        "_id": "62e2a0ba3113b8234511cd74",
                        "sentence": "hello 2 ",
                        "example": "Hello , what's your name 2 ",
                        "translate": "مرحبا ما اسمك 2",
                        "imageUrl": "src/img/keywords/keyword-2JO7D-1659019450396.png",
                        "audioUrl": "src/audio/keywords/keyword-kt5Tc-1659019450397.mpeg",
                        "createdAt": "2022-07-28T14:44:10.400Z",
                        "updatedAt": "2022-07-28T14:44:10.400Z",
                        "__v": 0
                    }
                ],
                "type": "strong"
            }
        ]

and i want this result :

[
            {
   
                "props": [
                    {
                        "_id": "62e2a0ad3113b8234511cd72",

                        "sentence": "hello",
                        "example": "Hello , what's your name",
                        "translate": "مرحبا ما اسمك",
                        "imageUrl": "src/img/keywords/keyword-A7H_M-1659019437698.png",
                        "audioUrl": "src/audio/keywords/keyword-YyhUp-1659019437700.mpeg",
                        "createdAt": "2022-07-28T14:43:57.708Z",
                        "updatedAt": "2022-07-28T14:43:57.708Z",
                        "__v": 0
                    },
                    {
                        "_id": "62e2a0ba3113b8234511cd74",
                        "isBookMarked" : false 
                        "sentence": "hello 2 ",
                        "example": "Hello , what's your name 2 ",
                        "translate": "مرحبا ما اسمك 2",
                        "imageUrl": "src/img/keywords/keyword-2JO7D-1659019450396.png",
                        "audioUrl": "src/audio/keywords/keyword-kt5Tc-1659019450397.mpeg",
                        "createdAt": "2022-07-28T14:44:10.400Z",
                        "updatedAt": "2022-07-28T14:44:10.400Z",
                        "__v": 0
                    }
                ],
                "type": "strong"
            }
        ]

>Solution :

You can just populate with the keywordId not with aggregate

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading