I have a nested data(in Array) inside the Proreg(short for Product Regitration) Model now I am having issue with retrieving the actual name of these properties. I have tried it with populate method but nothing works can somebody please help out here?

Note: oem will be the companyname, category will be category, and subcategory will be subcategory. I need only these three to be populated.

//ProReg Routes

const express = require("express");
const router = express.Router();

// Post model
const ProReg = require("../../../models/Entries/ProReg");

// @route   GET api/posts/test
// @desc    Tests post route
// @access  Public
router.get("/test", (req, res) => res.json({ msg: "ProReg Works" }));

// @route   GET api/posts
// @desc    Get posts
// @access  Public
router.get("/", (req, res) => {
  ProReg.find()
    .populate('customer', 'customername')
    .populate('customertype', 'customertype')
    .populate('department', 'department')
    .populate({path: 'products', poplate: })
    .sort({ date: -1 })
    .then(proreg => res.json(proreg))
    .catch(err => res.status(404).json({ msg: "No Pro Reg found" }));
});

// @route   GET api/posts/:id
// @desc    Get post by id
// @access  Public
router.get("/:id", (req, res) => {
  ProReg.findById(req.params.id)
    // .populate({path: 'products', populate:['oem','category'], select:'_id'})
    // .populate('products', 'oem')
    .then(proreg => res.json(proreg))
    .catch(err =>
      res.status(404).json({ msg: "No Pro Reg found with that ID" })
    );
});

// // @route   POST api/posts
// // @desc    Create post
// // @access  Private
router.post("/", (req, res) => {
  const newProReg = new ProReg({
    refno1: req.body.refno1,
    refno2: req.body.refno2,
    date: req.body.date,
    customer: req.body.customerid,
    customertype: req.body.customertypeid,
    department: req.body.customersubdepartmentid
  });

  newProReg.save().then(proreg => res.json(proreg));
});

//Delete particular id of Product Registration Data using their ids
router.delete("/delete/:id", (req, res) => {
  ProReg.findById(req.params.id)
    .then(proreg =>
      proreg
        .remove()
        .then(proreg =>
          res.status(200).json({ msg: "Pro Reg Deleted Successfully" })
        )
    )
    .catch(proreg =>
      res.status(400).json({ msg: "Error in deleting Pro Reg " })
    );
});

// @route   POST /product/:id
// @desc    Add Product to post
// @access  Private
router.post("/product/:id", (req, res) => {
  ProReg.findById(req.params.id)
    .then(proreg => {
      const newProduct = {
        oem: req.body.companyid,
        category: req.body.productcategoryid,
        subcategory: req.body.productsubcategoryid,
        modelno: req.body.modelno,
        serialno: req.body.serialno,
        warrantyfrom: req.body.warrantyfrom,
        warrantyto: req.body.warrantyto,
        oemwarrantyfrom: req.body.oemwarrantyfrom,
        oemwarrantyto: req.body.oemwarrantyto
      };
      // Add to product array
      proreg.products.push(newProduct);

      // Save
      proreg.save().then(proreg => res.json(proreg));
    })
    .catch(err => res.status(404).json({ proregnotfound: "No pro reg found" }));
});

//Edit a particular Product Registration data using id to edit
router.get("/edit/:id", (req, res) => {
  ProReg.findById(req.params.id)
    .exec()
    .then(proreg => res.json(proreg))
    .catch(err =>
      res.status(404).json({ msg: "Product Registration Not Found" })
    );
});

//Update Product Registration  using their ids
router.post("/update/:id", (req, res) => {
  ProReg.findByIdAndUpdate(req.params.id, req.body)
    .then(proreg => {
      res
        .status(200)
        .json({ msg: "Product Registration Updated Successfully" });
    })
    .catch(proreg => {
      res.status(400).json({ msg: "Error in updating Product Registration " });
    });
});

// @route   DELETE /product/:id/:product_id
// @desc    Remove product from post
// @access  Private
router.delete("/product/:id/:product_id", (req, res) => {
  ProReg.findById(req.params.id)
    .then(proreg => {
      // Check to see if Product exists
      if (
        proreg.products.filter(
          product => product._id.toString() === req.params.product_id
        ).length === 0
      ) {
        return res.status(404).json({ message: "Product does not exist" });
      }

      // Get remove index
      const removeIndex = proreg.products
        .map(item => item._id.toString())
        .indexOf(req.params.product_id);

      // Splice product out of array
      proreg.products.splice(removeIndex, 1);

      proreg.save().then(proreg => res.json(proreg));
    })
    .catch(err =>
      res.status(404).json({ message: "No Product Registration found" })
    );
});

// @route   UPDATE /product/:id/:product_id
// @desc    Remove product from post
// @access  Private
router.post("/product/:id/:product_id", (req, res) => {
  let updateObj = { $set: {} };
  for (var param in req.body) {
    updateObj.$set["products.$." + param] = req.body[param];
  }
  ProReg.update(
    { "products._id": req.params.product_id },
    {
      $set: {
        "products.$.oem": req.body.companyid,
        "products.$.category": req.body.productcategoryid,
        "products.$.subcategory": req.body.productsubcategoryid,
        "products.$.modelno": req.body.modelno,
        "products.$.serialno": req.body.serialno,
        "products.$.warrantyfrom": req.body.warrantyfrom,
        "products.$.warrantyto": req.body.warrantyto,
        "products.$.oemwarrantyfrom": req.body.oemwarrantyfrom,
        "products.$.oemwarrantyto": req.body.oemwarrantyto
      }
    },
    (err, result) => {
      if (err) {
        res.status(500).json({ error: "Unable to update competitor." });
      } else {
        res
          .status(200)
          .json({
            msg:
              "Yes Bakor! You have successfully updated the nnested Product in this Product Regitration Schema"
          });
      }
    }
  );
});

module.exports = router;

//ProReg Model

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

// Create Schema
const ProRegSchema = new Schema({

  refno1: {
    type: String
  },
  refno2: {
    type: String
  },
  date: {
    type: Date
  },
  customer: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "customer" 
},
customertype: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "customertype" 
},
department: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "customersubdepartment" 
},

  products: [{
      oem: {
        type: Schema.Types.ObjectId,
        ref: 'product'
      },
      category: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "product"
      },
      subcategory: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "product"
      },
      modelno: {
        type: String
      },
      serialno: {
        type: String
      },
      warrantyfrom: {
        type: Date
      },
      warrantyto: {
        type: Date
      },
      oemwarrantyfrom: {
        type: Date
      },
      oemwarrantyto: {
        type: Date
      }, 
    }
  ],
  date: {
    type: Date,
    default: Date.now
  }
});

module.exports = ProReg = mongoose.model('proreg', ProRegSchema);


0 Answers