NodeJs / MongoDB Aggregate Result Populate

Viewed 34

I've a Get Method for getting data from MongoDb. So Before this , I 'll send you my Models.

This is Attributes Model .

const mongoose = require('mongoose');
const Schema = mongoose.Schema ;

const attributeSchema = new Schema({
    Name : {
        type: String,
        required : true
    },
    Type : {
        type: String,
        required : true
    },
    ItemTypes : [{
        type: mongoose.Schema.Types.ObjectId, ref:'ItemTypes',
        required : true
    }],
    Code : {
        type: String,
        required : true
    },
    isRequired : {
        type: Boolean,
        required : true
    },
    CreatedUser:{
        type: mongoose.Schema.Types.ObjectId , ref:'Users',
        required:true
    },
    UpdatedUser:{
        type: mongoose.Schema.Types.ObjectId , ref:'Users',
        required:true
    },
    CreatedOn : {
        type: Date,
        default: Date.now
    },
    UpdatedOn : {
        type: Date,
        default: Date.now
    },
})

module.exports = mongoose.model('Attributes',attributeSchema);

And This is Item Model

const mongoose = require('mongoose');
const Schema = mongoose.Schema ;

const itemSchema = new Schema({
    Name : {
        type: String,
        required : true
    },
    Code : {
        type: String,
        required : true
    },
    ItemType : {
        type: mongoose.Schema.Types.ObjectId , ref : "ItemTypes",
        required : true
    },
    Family : {
        type: String,
        required : true
    },
    Attributes : [{
        type: mongoose.Schema.Types.ObjectId , ref: "Attributes",
        required : true
    }],
    CreatedUser:{
        type: mongoose.Schema.Types.ObjectId , ref:'Users',
        required:true
    },
    UpdatedUser:{
        type: mongoose.Schema.Types.ObjectId , ref:'Users',
        required:true
    },
    CreatedOn : {
        type: Date,
        default: Date.now
    },
    UpdatedOn : {
        type: Date,
        default: Date.now
    },
})

module.exports = mongoose.model('Items',itemSchema);

And this is ItemValue Model

const mongoose = require('mongoose');
const Schema = mongoose.Schema ;

const itemValueSchema = new Schema({
    Item : {
        type: mongoose.Schema.Types.ObjectId, ref:'Items',
        required : true
    },
    Attribute : {
        type: mongoose.Schema.Types.ObjectId, ref:'Attributes',
        required : true
    },
    Value : {
        type: String,
        required : true
    },
    CreatedUser:{
        type: mongoose.Schema.Types.ObjectId , ref:'Users',
        required:true
    },
    UpdatedUser:{
        type: mongoose.Schema.Types.ObjectId , ref:'Users',
        required:true
    },
    CreatedOn : {
        type: Date,
        default: Date.now
    },
    UpdatedOn : {
        type: Date,
        default: Date.now
    },
})

module.exports = mongoose.model('ItemValues',itemValueSchema);

So I've a Get Method for Get Item . But when I get item, I want to show this item's Attributes and This Attributes Values from ItemValues table. This is my Get Method

router.get('/test2', async (req, res) => {
  itemModel.aggregate(
    [
      {
        $match: { Code: 'UmitHesapCode11223' }
      },
      {
        $lookup:
        {
          from: "itemvalues",
          localField: "_id",
          foreignField: "Item",
          as: "ItemValues"
        },
      },
      {
        $group: {
          _id: "$_id"
        }
      }
    ]
  )
    .exec((err, result) => {
      if (err) return res.status(400).send(err)
      res.status(200).send(result)
    })
})

When I call this method , This Response is returning =>

[
    {
        "_id": "631cbdd8a63c12fd5f4638be",
        "Name": "UmitHesap",
        "Code": "UmitHesapCode11223",
        "Family": "AccountFamily",
        "UpdatedUser": "631c78a8067dacf22960edff",
        "CreatedOn": "2022-09-10T16:39:52.842Z",
        "UpdatedOn": "2022-09-10T16:39:52.842Z",
        "ItemValues": [
            {
                "Attribute": "631ca8dcad85970ea70869b4",
                "Value": "Umit"
            },
            {
                "Attribute": "631ca8e7ad85970ea70869b7",
                "Value": "Camurcuk"
            },
            {
                "Attribute": "631ca8f6ad85970ea70869ba",
                "Value": "BOLU"
            },
            {
                "Attribute": "631ca902ad85970ea70869bd",
                "Value": "12/09/1997"
            },
            {
                "Attribute": "631ca910ad85970ea70869c0",
                "Value": "905301237997"
            }
        ]
    },
    {
        "_id": "631cbe0d7b97c716d5e9cdd9",
        "Name": "UmitHesap",
        "Code": "UmitHesapCode",
        "Family": "AccountFamily",
        "UpdatedUser": "631c78a8067dacf22960edff",
        "CreatedOn": "2022-09-10T16:40:45.306Z",
        "UpdatedOn": "2022-09-10T16:40:45.306Z",
        "ItemValues": [
            {
                "Attribute": "631ca8dcad85970ea70869b4",
                "Value": "Umit"
            },
            {
                "Attribute": "631ca8e7ad85970ea70869b7",
                "Value": "Camurcuk"
            },
            {
                "Attribute": "631ca8f6ad85970ea70869ba",
                "Value": "BOLU"
            },
            {
                "Attribute": "631ca902ad85970ea70869bd",
                "Value": "12/09/1997"
            },
            {
                "Attribute": "631ca910ad85970ea70869c0",
                "Value": "905301237997"
            }
        ]
    },
    {
        "_id": "6325d9ff37d2c77e60632d63",
        "Name": "Product",
        "Code": "umitProduct",
        "Family": "testProduct",
        "UpdatedUser": "631c78a8067dacf22960edff",
        "CreatedOn": "2022-09-17T14:30:23.183Z",
        "UpdatedOn": "2022-09-17T14:30:23.183Z",
        "ItemValues": [
            {
                "Attribute": "631ca927ad85970ea70869c3",
                "Value": "MacStand"
            },
            {
                "Attribute": "631ca92ead85970ea70869c6",
                "Value": "13323TL"
            },
            {
                "Attribute": "631ca937ad85970ea70869c9",
                "Value": "1500"
            },
            {
                "Attribute": "631ca941ad85970ea70869cc",
                "Value": "300TL"
            }
        ]
    }
]

So in This response, I want to Populate ItemValues.Attribute. Which I mean this.

postman Response

how I can fix this ? I tried so much way but I can't fix it.

0 Answers
Related