我应该如何正确使用mongoose填充?

我正在学习一些节点,并试图使用mongoose。 目前,我的目标是学习如何使用填充 。

我有一个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")(); 

然后,我在project.js中的某个点执行此操作:

 Project.find(query, {}, {sort: {_id: -1}}, function (error, results) { callback(results); } ).populate("milestones"); 

我如何填充里程碑?


这里是来自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)无法知道在查询触发后可能调用哪些其他方法。 所以,当你将callback传递给.find ,mongoose会立即发送查询。

通过callbackfind

  • 通过参数定义的查询来find
  • 由于callback在那里,查询立即执行并发出命令给数据库
  • 那么.populate发生,但它已经没有效果,因为查询已经发送到mongo

这是你需要做的:

 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); }); 

省略callback并使用.exec

  • 传递给.find查询将创build具有参数的查询对象
  • 额外的链接调用.sort.populate等进一步configuration查询
  • .exec告诉mongoose你已经完成configuration查询和mongoose问题DB命令