6

我正在学习一些节点并且一直在尝试使用猫鼬。目前,我的目标是学习如何使用populate

我有一个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

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

如何填充里程碑?


以下是project来自 mongo 的数据:

{
    "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);
4

1 回答 1

14

您需要获得定义查询选项然后执行的顺序,并且诸如 mongoose Query 之类的可链接 API 无法知道在查询触发之后您可能会调用哪些其他方法。因此,当您将回调传递给 时.find,猫鼬会立即发送查询。

将回调传递给find

  • 由参数定义的查询find
  • 由于存在回调,查询立即执行并向数据库发出命令
  • 然后.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

  • 传递给.find创建带有参数的查询对象的查询
  • 额外的链式调用.sort.populate进一步配置查询
  • .exec告诉 mongoose 您已完成配置查询,并且 mongoose 发出 DB 命令
于 2013-07-11T18:22:11.343 回答