Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js - Creating Relationships with Mongoose

I have 2 Schemas, Custphone and Subdomain. Custphone belongs_to a Subdomain and Subdomain has_many Custphones.

The problem is in creating the relationship using Mongoose. My goal is to do: custphone.subdomain and get the Subdomain that the Custphone belongs to.

I have this in my schemas:

SubdomainSchema = new Schema     name : String  CustphoneSchema = new Schema     phone : String     subdomain  : [SubdomainSchema] 

When I print the Custphone result I get this:

{ _id: 4e9bc59b01c642bf4a00002d,   subdomain: [] } 

When the Custphone result has {"$oid": "4e9b532b01c642bf4a000003"} in MongoDB.

I want to do custphone.subdomain and get the subdomain object of the custphone.

like image 511
donald Avatar asked Oct 18 '11 16:10

donald


People also ask

How do mongooses make relationships?

To model relationships between connected data, you can reference a document or embed it in another document as a sub document. Referencing a document does not create a “real” relationship between these two documents as does with a relational database. Referencing documents is also known as normalization.

Is Mongoose relational database?

Mongoose is designed in such a way that you can model your tables relationally with relative ease and populate relational data based on the ref you defined in the schema.

Is it mandatory to use Mongoose with Node application?

It's not mandatory to use Mongoose over the MongoDB Native API. However, there are some benefits to doing so.


1 Answers

It sounds like you're looking to try the new populate functionality in Mongoose.

Using your example above:

var Schema = mongoose.Schema,     ObjectId = Schema.ObjectId;  SubdomainSchema = new Schema     name : String  CustphoneSchema = new Schema     phone : String     subdomain  : { type: ObjectId, ref: 'SubdomainSchema' } 

The subdomain field will be is updated with an '_id' such as:

var newSubdomain = new SubdomainSchema({name: 'Example Domain'}) newSubdomain.save()  var newCustphone = new CustphoneSchema({phone: '123-456-7890', subdomain: newSubdomain._id}) newCustphone.save() 

To actually get data from the subdomain field you're going to have to use the slightly more complex query syntax:

CustphoneSchema.findOne({}).populate('subdomain').exec(function(err, custPhone) {  // Your callback code where you can access subdomain directly through custPhone.subdomain.name  }) 
like image 102
Dan Avatar answered Sep 19 '22 22:09

Dan