Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Mongoose schema within schema

Mongoose schema within schema

Problem

How can I add a Schema to another schema? This doesn't seem to be valid:

var UserSchema = new Schema({
    name        : String,
    app_key     : String,
    app_secret  : String
})



var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : UserSchema
})

I checked the website and it shows how to declare it for an array but not for single.

Thanks

Problem courtesy of: 0xSina

Solution

There are a few ways to do this. The simplest is just this:

var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : Schema.ObjectId
});

Then you just have to make sure your app is writing that id and using it in queries to fetch "related" data as necessary.

This is fine when searching tasks by user id, but more cumbersome when querying the user by task id:

// Get tasks with user id
Task.find({user: user_id}, function(err, tasks) {...});

// Get user from task id
Task.findById(id, function(err, task) {
  User.findById(task.user, function(err, user) {
    // do stuff with user
  }
}

Another way is to take advantage of Mongoose's populate feature to simplify your queries. To get this, you could do the following:

var UserSchema = new Schema({
    name        : String,
    app_key     : String,
    app_secret  : String,
    tasks       : [{type: Schema.ObjectId, ref: 'Task'}] // assuming you name your model Task
});

var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : {type: Schema.ObjectId, ref: 'User'} // assuming you name your model User
});

With this, your query for all users, including arrays of their tasks might be:

User.find({}).populate('tasks').run(function(err, users) {
  // do something
});

Of course, this means maintaining the ids in both places. If that bothers you, it may be best to stick to the first method and just get used to writing more complex (but still simple enough) queries.

Solution courtesy of: glortho

Discussion

View additional discussion.



This post first appeared on Node.js Recipes, please read the originial post: here

Share the post

Mongoose schema within schema

×

Subscribe to Node.js Recipes

Get updates delivered right to your inbox!

Thank you for your subscription

×