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