Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该如何正确使用猫鼬填充?_Javascript_Node.js_Mongoose_Populate - Fatal编程技术网

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
,这可能会让你感到困惑,看起来像是重复的。我会将其从模式中删除,并在
里程碑
正确填充后将其从数据中迁移。我检查了数据,对我来说很好。我把它贴在了柱子上。你看到有什么不对劲吗?聊天链接不起作用。我想知道这是如何解决的。谢谢