简体   繁体   中英

how to insert array of objects and array of nested objects into mongodb using mongoose in nodejs

I understand there are similar questions already available but all of those questions talks about only array of nested objects but my query is array of objects and each object in array contains nested objects. So other questions are not helpful for me in this case.

My query is I want to insert below data into mongodb using mongoose in nodejs.

My JSON looks like below

{"categories": [
    {
        "name": "Books & Magazines", 
        "value": 1,
        "subCategories":[
            {
                "name": "Book", 
                "value": 1,
            },
            {
                "name": "Book series", 
                "value": 2,
            }
        ]
    },
    {
        "name": "Books & Magazines", 
        "value": 2,
        "subCategories":[
            {
                "name": "Book", 
                "value": 1,
            },
            {
                "name": "Book series", 
                "value": 2,
            }
        ]
    },
    {
        "name": "Books & Magazines", 
        "value": 3,
        "subCategories":[
            {
                "name": "Book", 
                "value": 1,
            },
            {
                "name": "Book series", 
                "value": 2,
            }
        ]
    }
    ]
}

My schema for this JSON looks like below

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

var CategorySchema = new Schema({
      categories:[{
        name: {
          type: String, 
          required: true, 
          trim: true
        },
        value: {
          type: Number, 
          required: true
        },
        createdAt: {
          type: Date, 
          default: Date.now
        },
        updatedAt: {
          type: Date, 
          default: Date.now
        },
        subCategories:  [{
          name: {
            type: String, 
            required: true, 
            trim: true
          },
          value: {
            type: Number, 
            required: true
          }
        }] 
    }]
})

module.exports = mongoose.model('Page_Categories', CategorySchema);

Controller part below

const Page_Categories = require('../models/categories');

exports.savePageCategories = function (req, res, next) {
    const data = req.body;
    // console.log("Data: ", data.categories)
    const pageCategories = new Page_Categories({ data });
console.log("pageCategories: ", pageCategories)
    pageCategories.save((err, post) => {
      if (err) { return next(err); }

      res.status(201).json({
        user: post
      });
    });
};

I am able to successfully save but it saves as empty record. Please see below

{ "_id" : ObjectId("5a5ae9e7855059417c471784"), "categories" : [ ], "__v" : 
0 }

Any idea why it inserts empty record?

Help from @Marventus resolved the issue.

If you look at my json (it's in my question) it is actually an array of categories and each category has its own sub category which is also an array. So if you look at below schema I had declared name, value, createdAt, updatedAt as a normal object instead of an array. Which was failing with validations.

var CategorySchema = new Schema({
    name: {
      type: String, 
      required: true, 
      trim: true
    },
    value: {
      type: Number, 
      required: true
    },
    createdAt: {
      type: Date, 
      default: Date.now
    },
    updatedAt: {
      type: Date, 
      default: Date.now
    },
    subCategories:  [{
      name: {
        type: String, 
        required: true, 
        trim: true
      },
      value: {
        type: Number, 
        required: true
      } 
    }]
})

Working schema: I have changed top level categories to an array and it worked

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

var CategorySchema = new Schema({
      categories:[{
        name: {
          type: String, 
          required: true, 
          trim: true
        },
        value: {
          type: Number, 
          required: true
        },
        createdAt: {
          type: Date, 
          default: Date.now
        },
        updatedAt: {
          type: Date, 
          default: Date.now
        },
        subCategories:  [{
          name: {
            type: String, 
            required: true, 
            trim: true
          },
          value: {
            type: Number, 
            required: true
          }
        }] 
    }]
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM