Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 707
Samuel E. Avatar asked Sep 20 '16 14:09

Samuel E.


People also ask

What is nested schema?

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.

Can you have a schema within a schema?

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.

Where can I find nested documents in MongoDB?

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.


2 Answers

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,     },   } ); 
like image 128
asissuthar Avatar answered Sep 16 '22 12:09

asissuthar


// 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. 
like image 37
esraa ali Avatar answered Sep 19 '22 12:09

esraa ali