Search code examples
node.jsmongodbmongoose-schema

Nested objects in mongoose schemas


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?


Solution

  • const mongoose = require("mongoose");
    
    // Make connection
    // https://mongoosejs.com/docs/connections.html#error-handling
    mongoose.connect("mongodb://localhost:27017/test", {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    
    // Define schema
    // https://mongoosejs.com/docs/models.html#compiling
    const AddressSchema = mongoose.Schema({
      city: String,
      street: String,
      houseNumber: String,
    });
    
    const ContactInfoSchema = mongoose.Schema({
      tel: [Number],
      email: [String],
      address: {
        type: AddressSchema,
        required: true,
      },
    });
    
    const CustomerSchema = mongoose.Schema({
      firstName: String,
      lastName: String,
      company: String,
      connectInfo: ContactInfoSchema,
    });
    
    const CustomerModel = mongoose.model("Customer", CustomerSchema);
    
    // 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]"],
      },
    });
    
    // 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.updateOne(
      { firstName: "Ashish" },
      {
        $set: {
          "connectInfo.tel.0": 8154099999,
        },
      }
    );