一尘不染

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

node.js

我正在学习一些节点,并一直尝试使用猫鼬。目前,我的目标是学习如何使用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);

阅读 237

收藏
2020-07-07

共1个答案

一尘不染

您需要获得定义查询选项然后执行的顺序,并且可链接的API(例如mongoose
Query)不知道在查询触发后您可能会调用哪些其他方法。因此,当您将回调传递给时.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 告诉猫鼬您已完成配置查询,猫鼬发出了DB命令
2020-07-07