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?
Schemas can be nested to represent relationships between objects (e.g. foreign key relationships). For example, a Blog may have an author represented by a User object. import datetime as dt class User: def __init__(self, name, email): self.
Subdocuments are documents embedded in other documents. In Mongoose, this means you can nest schemas in other schemas. Mongoose has two distinct notions of subdocuments: arrays of subdocuments and single nested subdocuments.
Accessing embedded/nested documents – In MongoDB, you can access the fields of nested/embedded documents of the collection using dot notation and when you are using dot notation, then the field and the nested field must be inside the quotation marks.
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,     },   } ); 
                        // 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. 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With