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

时间:2021-08-21 02:30:59

I am learning some node and have been trying to use mongoose. Currently, my goal is to learn how to use populate.

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

I have a projects definition and milestone require:

我有项目定义和里程碑要求:

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")();

Then I do this at some point in the projects.js:

然后我在projects.js中的某个时刻执行此操作:

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

How do I populate the milestones?

我如何填充里程碑?


Here is the project data from mongo:

这是来自mongo的项目数据:

{
    "title": "sitename",
    "description": "online thing",
    "creation_date": {
        "$date": "2013-07-11T19:45:42.139Z"
    },
    "_id": {
        "$oid": "51df0b66dbdd7c4f14000001"
    },
    "milestones": [],
    "milestone_ids": [],
    "__v": 0
}

And this one is the milestone that is basically connected to the project:

而这个是与项目基本相关的里程碑:

{
    "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
}

Also, this is the milestone schema:

此外,这是里程碑架构:

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);

1 个解决方案

#1


12  

You need to get the order right of defining query options then executing, and chainable APIs such as mongoose Query can't know what additional methods you might call AFTER the query fires. So when you pass the callback to .find, mongoose sends the query right away.

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

Pass a callback to find

  • query defined by arguments to find
  • 查询由查询定义查找

  • since callback is there, query immediately executes and issues command to DB
  • 由于回调在那里,查询立即执行并向DB发出命令

  • then .populate happens, but it has no effect as the query has already been sent to mongo
  • 然后.populate发生了,但它没有效果,因为查询已经发送到mongo

Here's what you need to do:

这是你需要做的:

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

Or a little more readable:

或者更具可读性:

Project
    .find(query)
    .sort('-_id')
    .populate('milestones')
    .exec(function(error, results) {                  
        callback(results);
    });

Omit callback and use .exec

  • query passed to .find creates query object with parameters
  • 传递给.find的查询创建带参数的查询对象

  • additional chained calls to .sort, .populate etc further configure the query
  • 对.sort,.populate等的其他链式调用进一步配置查询

  • .exec tells mongoose you are done configuring the query and mongoose issues the DB command
  • .exec告诉mongoose你完成了配置查询并且mongoose发出了DB命令

#1


12  

You need to get the order right of defining query options then executing, and chainable APIs such as mongoose Query can't know what additional methods you might call AFTER the query fires. So when you pass the callback to .find, mongoose sends the query right away.

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

Pass a callback to find

  • query defined by arguments to find
  • 查询由查询定义查找

  • since callback is there, query immediately executes and issues command to DB
  • 由于回调在那里,查询立即执行并向DB发出命令

  • then .populate happens, but it has no effect as the query has already been sent to mongo
  • 然后.populate发生了,但它没有效果,因为查询已经发送到mongo

Here's what you need to do:

这是你需要做的:

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

Or a little more readable:

或者更具可读性:

Project
    .find(query)
    .sort('-_id')
    .populate('milestones')
    .exec(function(error, results) {                  
        callback(results);
    });

Omit callback and use .exec

  • query passed to .find creates query object with parameters
  • 传递给.find的查询创建带参数的查询对象

  • additional chained calls to .sort, .populate etc further configure the query
  • 对.sort,.populate等的其他链式调用进一步配置查询

  • .exec tells mongoose you are done configuring the query and mongoose issues the DB command
  • .exec告诉mongoose你完成了配置查询并且mongoose发出了DB命令