how to push object into subdoccument of mongoose schema

Viewed 25

Model.js

const mongoose=require('mongoose');
const validator=require('validator');
const RegisterationSchema=mongoose.Schema({
    name:{
        type:String,
        required:true,
    },
    email:{
        type:String,
        required:true,
        trim:true,
        unique:true,
        validate(value){
            if(!validator.isEmail(value)){
                throw new Error ("Please enter correct email");
            }
        }
    },
    password:{
        type:String,
        required:true,
        validate(value){
            if(value.length<6){
                throw new Error ("Please enter password more than 6 character");
            }
        }
    },
    isAdmin:{
        type:Boolean
    }
})
const RegisterProductSchema=mongoose.Schema({
name:{
    type:String,
    required:true
},
price:{
    type:Number,
    required:true,
    validate(value){
        if(value<=0){
            throw new Error('Price should be more than 0');
        }
    }
},
size:{
    type:String,
    required:true
},
stock:{
    type:Number,
    required:true
},
unit:{
    type:String,
    required:true
},
category:{
    type:String,
    required:true
},
brand:{
    type:String,
    required:true
},
images:{
    type:Buffer,
    required:true,
}
})
const RegisterProduct=mongoose.Schema({
    a_id:{
        type:String,
        required:true
    },
    products:[RegisterProductSchema]
})
const Registeration=mongoose.model('registeration',RegisterationSchema);
const CreateProduct=mongoose.model('register products',RegisterProduct)
module.exports={
    Registeration,
    CreateProduct
}

What I am doing is if the a_id="12345" is there in DB then append object for eg

{
"name":"abc".
"price":10,
"size":"M",
"stock:200,
"unit":"pcs",
"category":"shirt",
"brand":"levis"
}

into products array in db like a person is adding all the products into his accounts

controller

exports.createProducts=async(req,res)=>{
    const createProducts=new CreateProduct();
    const name=req.body.name;
    const price=req.body.price;
    const size=req.body.size;
    const stock=req.body.stock;
    const unit=req.body.unit;
    const category=req.body.category;
    const brand=req.body.brand;
    const images=req.file.buffer;
    const obj={
        name,
        price,
        size,
        stock,
        unit,
        category,
        brand,
        images
    }
    const savedId=await CreateProduct.findOne({a_id:"12345"});
    console.log(savedId.a_id);
    if(savedId.a_id==="12345"){
        console.log("in save product");
        createProducts.products=createProducts.products.push(obj);
    }
    else{
        createProducts.a_id="12345";
        createProducts.products=createProducts.products.concat(obj);
    }
    try{
        await createProducts.save();
        res.status(201).send({message:"succesfully saved"});
    }
    catch(err){
        console.log(err);
        res.status(400).send("unsuccessfull");
    }

}

error

   Error: register products validation failed: products: Cast to embedded failed for value "1" (type number) at path "products" because of "ObjectParameterError", a_id: Path `a_id` is required.
    at ValidationError.inspect (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\error\validation.js:48:26)
    at formatValue (node:internal/util/inspect:782:19)
    at inspect (node:internal/util/inspect:347:10)
    at formatWithOptionsInternal (node:internal/util/inspect:2167:40)
    at formatWithOptions (node:internal/util/inspect:2029:10)
    at console.value (node:internal/console/constructor:324:14)
    at console.log (node:internal/console/constructor:360:61)
    at exports.createProducts (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\controllers\create products controller.js:42:17)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  errors: {
    products: CastError: Cast to embedded failed for value "1" (type number) at path "products" because of "ObjectParameterError"
        at DocumentArrayPath.cast (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schema\documentarray.js:511:19)     
        at DocumentArrayPath.cast (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schema\documentarray.js:426:17)     
        at DocumentArrayPath.SchemaType.applySetters (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schematype.js:1192:12)
        at model.$set (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\document.js:1364:22)
        at model.set [as products] (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\helpers\document\compile.js:182:19)        at exports.createProducts (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\controllers\create products controller.js:31:32)
        at processTicksAndRejections (node:internal/process/task_queues:96:5) {
      stringValue: '"1"',
      messageFormat: undefined,
      kind: 'embedded',
      value: 1,
      path: 'products',
      reason: ObjectParameterError: Parameter "obj" to Document() must be an object, got 1
          at EmbeddedDocument.Document (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\document.js:113:11)
          at EmbeddedDocument.Subdocument (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\types\subdocument.js:31:12) 
          at EmbeddedDocument.ArraySubdocument [as constructor] (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\types\ArraySubdocument.js:34:15)
          at new EmbeddedDocument (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schema\documentarray.js:134:17)     
          at DocumentArrayPath.cast (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schema\documentarray.js:505:22)   
          at DocumentArrayPath.cast (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schema\documentarray.js:426:17)   
          at DocumentArrayPath.SchemaType.applySetters (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schematype.js:1192:12)
          at model.$set (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\document.js:1364:22)
          at model.set [as products] (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\helpers\document\compile.js:182:19)
          at exports.createProducts (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\controllers\create products controller.js:31:32),
      valueType: 'number'
    },
    a_id: ValidatorError: Path `a_id` is required.
        at validate (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schematype.js:1337:13)
        at SchemaString.SchemaType.doValidate (C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\schematype.js:1321:7)   
        at C:\Users\mahir\OneDrive\Documents\E Commerce Project\backend\node_modules\mongoose\lib\document.js:2830:18
        at processTicksAndRejections (node:internal/process/task_queues:78:11) {
      properties: [Object],
      kind: 'required',
      path: 'a_id',
      value: undefined,
      reason: undefined,
      [Symbol(mongoose:validatorError)]: true
    }
  },
  _message: 'register products validation failed'
}
0 Answers
Related