Javascript 我应该如何正确使用猫鼬填充?
我正在学习一些节点,并一直在尝试使用猫鼬。目前,我的目标是学习如何使用 我有一个Javascript 我应该如何正确使用猫鼬填充?,javascript,node.js,mongoose,populate,Javascript,Node.js,Mongoose,Populate,我正在学习一些节点,并一直在尝试使用猫鼬。目前,我的目标是学习如何使用 我有一个项目定义和里程碑要求: projectSchema = new mongoose.Schema({ id: String, title: String, description: String, owner: String, site: String, creation_date: Date, milestone_ids: Array, mileston
项目
定义和里程碑
要求:
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中的某个点上这样做:
Project.find(query, {}, {sort: {_id: -1}},
function (error, results) {
callback(results);
}
).populate("milestones");
如何填充里程碑
以下是来自mongo的项目
数据:
{
"title": "sitename",
"description": "online thing",
"creation_date": {
"$date": "2013-07-11T19:45:42.139Z"
},
"_id": {
"$oid": "51df0b66dbdd7c4f14000001"
},
"milestones": [],
"milestone_ids": [],
"__v": 0
}
这是与项目基本相关的里程碑
:
{
"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);
您需要获得定义查询选项然后执行的顺序,而mongoose query等可链接API无法知道在查询触发后您可能会调用哪些其他方法。因此,当您将回调传递给.find
时,mongoose会立即发送查询
将回调传递给find
- 由
find
- 由于存在回调,查询立即执行并向DB发出命令
- 然后,
.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);
});
省略回调并使用.exec
- 查询传递到
。查找创建带参数的查询对象
- 对
.sort
、.populate
等的附加链式调用进一步配置查询
.exec
告诉mongoose您已完成查询配置,mongoose发出DB命令
好的,你写的所有东西都很有意义。糟糕的是里程碑仍然没有被填充。我得到了一个空数组,就像以前一样。如果你发布更多的代码,我们可以查找简单的打字错误等等。恶魔就在这里的细节中,猫鼬基于字符串名称将所有这些连接在一起,并将自动复数等混淆的东西连接在一起。有一件事小写或单数不正确,你会得到不正确的行为,没有错误。不过,从你的代码片段中,我一眼就觉得一切都很好。你还有里程碑\u id
,这可能会让你感到困惑,看起来像是重复的。我会将其从模式中删除,并在里程碑
正确填充后将其从数据中迁移。我检查了数据,对我来说很好。我把它贴在了柱子上。你看到有什么不对劲吗?聊天链接不起作用。我想知道这是如何解决的。谢谢