Nested objects in mongoose schemas

node.jsMongodbMongoose Schema

node.js Problem Overview


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?

node.js Solutions


Solution 1 - node.js

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,
    },
  }
);

Solution 2 - node.js

// address model
    var addressModelSchema = new Schema({
        city: String,
        street: String,
        houseNumber: String
    })
    mongoose.model('address',addressModelSchema ,'address' )
    
// contactInfo model
    var contactInfoModelSchema = new Schema({
        tel: [Number],
        email: [String],
        address: {
            type: mongoose.Schema.Type.ObjectId,
            ref: 'address'
        }
    })
    mongoose.model('contactInfo ',contactInfoModelSchema ,'contactInfo ')
    
// customer model
    var customerModelSchema = new Schema({
        firstName: String,
        lastName: String,
        company: String,
        contactInfo: {
            type: mongoose.Schema.Type.ObjectId,
            ref: 'contactInfo'
        }  
    });
    mongoose.model('customer', customerModelSchema, 'customer')

// add new address then contact info then the customer info
// it is better to create model for each part.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSamuel E.View Question on Stackoverflow
Solution 1 - node.jsasissutharView Answer on Stackoverflow
Solution 2 - node.jsesraa aliView Answer on Stackoverflow