我正在学习一些节点,并一直尝试使用猫鼬。目前,我的目标是学习如何使用populate。
我有一个projects定义,并milestone要求:
projects
milestone
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")();
然后我在某个时候执行此操作projects.js:
projects.js
Project.find(query, {}, {sort: {_id: -1}}, function (error, results) { callback(results); } ).populate("milestones");
如何填充里程碑?
这是project来自mongo 的数据:
project
{ "title": "sitename", "description": "online thing", "creation_date": { "$date": "2013-07-11T19:45:42.139Z" }, "_id": { "$oid": "51df0b66dbdd7c4f14000001" }, "milestones": [], "milestone_ids": [], "__v": 0 }
这milestone是基本上与项目相关的一个:
{ "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 }
另外,这是里程碑模式:
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);
您需要获得定义查询选项然后执行的顺序,并且可链接的API(例如mongoose Query)不知道在查询触发后您可能会调用哪些其他方法。因此,当您将回调传递给时.find,猫鼬会立即发送查询。
.find
find
.populate
这是您需要做的:
Project.find(query, {}, { sort: { _id: -1 } }).populate("milestones").exec(function (error, results) { callback(results); });
或者更具可读性:
Project .find(query) .sort('-_id') .populate('milestones') .exec(function(error, results) { callback(results); });
.exec
.sort