Am am learning a bit of node and have been trying to use mongoose. Currently, my goal is to learn how to use populate.
I have this projects definition and milestone require:
projectSchema = new mongoose.Schema({
id: String,
title: String,
description: String,
owner: String,
site: String,
creation_date: Date,
milestone_ids: Array,
milestones: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Milestone"
}
]
}),
Project = mongoose.model("Project", projectSchema),
milestones = require(__dirname + "/milestones.js") ();
Then I do this at some point in the projects.js:
Project
.find(
query,
{},
{
sort: {_id: -1}
},
function(error, results) {
callback(results);
}
).populate("milestones");
My question would be how do I populate the milestones? I've read the populate part of the mongoose documentation and quite many posts here on StackOverflow, but to be frank, none of them provided a useful explanation for what I'm doing wrong - there has to be something wrong here.
UPDATE
Here is the project data from mongo:
{
"title": "sitename",
"description": "online thing",
"creation_date": {
"$date": "2013-07-11T19:45:42.139Z"
},
"_id": {
"$oid": "51df0b66dbdd7c4f14000001"
},
"milestones": [],
"milestone_ids": [],
"__v": 0
}
And this one is the milestone that is basically connected to the project:
{
"title": "Proof of concept",
"description": "Make it work.",
"due_date": {
"$date": "2013-07-11T19:46:38.535Z"
},
"project_id": "51df0b66dbdd7c4f14000001",
"_id": {
"$oid": "51df0b9edbdd7c4f14000002"
},
"__v": 0
}
Also, this is the milestone schema:
milestoneschema = new mongoose.Schema({
id: String,
title: String,
description: String,
owner: String,
site: String,
due_date: Date,
project_id: {
type: String,
ref: "Project"
}
}),
Milestone = mongoose.model("Milestone", milestoneschema);
You need to get the order right of defining query options then executing, and chainable APIs such as mongoose Query can't know what additional methods you might call AFTER the query fires. So when you pass the callback to .find, mongoose sends the query right away.
find.populate happens, but it has no effect as the query has already been sent to mongoHere's what you need to do:
Project
.find(
query,
{},
{
sort: {_id: -1}
}
).populate("milestones").exec(function(error, results) {
callback(results);
});
Or a little more readable:
Project
.find(query)
.sort('-_id')
.populate('milestones')
.exec(function(error, results) {
callback(results);
});
.sort, .populate etc further configure the query.exec tells mongoose you are done configuring the query and mongoose issues the DB command