我应该如何正确使用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命令