Nested objects in mongoose schemas

Samuel E. picture Samuel E. · Sep 20, 2016 · Viewed 48k times · Source

i've seen many answers to this question here, but i still don't get it (maybe because they use more "complex" examples)... So what im trying to do is a schema for a "Customer", and it will have two fields that will have nested "subfields", and others that may repeat. here is what i mean:

let customerModel = new Schema({
    firstName: String,
    lastName: String,
    company: String,
    contactInfo: {
        tel: [Number],
        email: [String],
        address: {
            city: String,
            street: String,
            houseNumber: String
        }
    }   
});

tel and email might be an array. and address will not be repeated, but have some sub fields as you can see.

How can i make this work?

Answer

asissuthar picture asissuthar · Sep 20, 2016
const mongoose = require('mongoose')

// Make connection
// https://mongoosejs.com/docs/connections.html#error-handling
mongoose.connect('mongodb://localhost/test')

// Define schema
// https://mongoosejs.com/docs/models.html#compiling
const CustomerModel = mongoose.model('CustomerModel', {
    firstName: String,
    lastName: String,
    company: String,
    connectInfo: {
        tel: [ Number ],
        email: [ String ],
        address: {
            city: String,
            street: String,
            houseNumber: String,
        },
    },
})

// Create a record
// https://mongoosejs.com/docs/models.html#constructing-documents
const customer = new CustomerModel({
    firstName: 'Ashish',
    lastName: 'Suthar',
    company: 'BitOrbits',
    connectInfo: {
        tel: [
            8154080079,
            6354492692,
        ],
        email: [
            '[email protected]',
            '[email protected]',
        ],
        address: {
            city: 'Radhanpur',
            street: 'Vithalnagar',
            houseNumber: '101',
        },
    },
})

// Insert customer object
// https://mongoosejs.com/docs/api.html#model_Model-save
customer.save((err, cust) => {
    if (err) return console.error(err)

    // This will print inserted record from database
    // console.log(cust);
})


// Display any data from CustomerModel
// https://mongoosejs.com/docs/api.html#model_Model.findOne
CustomerModel.findOne({ firstName: 'Ashish' }, (err, cust) => {
    if (err) return console.error(err)

    // To print stored data
    console.log(cust.connectInfo.tel[0]) // output 8154080079
})


// Update inner record
// https://mongoosejs.com/docs/api.html#model_Model.update
CustomerModel.update({ firstName: 'Ashish' }, {
    $set: {
        'connectInfo.tel.0': 8154099999,
    },
})