【问题标题】:How should I properly use populate with mongoose?我应该如何正确使用猫鼬填充?
【发布时间】:2013-07-10 00:57:19
【问题描述】:

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

如何填充里程碑?


这是来自 mongo 的 project 数据:

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

【问题讨论】:

    标签: javascript node.js mongoose populate


    【解决方案1】:

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

    将回调传递给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

    • 传递给.find的查询创建带有参数的查询对象
    • .sort.populate 等的附加链式调用进一步配置查询
    • .exec 告诉 mongoose 您已完成配置查询,然后 mongoose 发出 DB 命令

    【讨论】:

    • 好的,你写的所有东西都很有意义。坏事是里程碑仍然没有填充。我在那里得到一个空数组,就像以前一样。
    • 此外,如果您发布更多代码,我们可以查找简单的拼写错误等。魔鬼在细节中,因为猫鼬根据字符串名称将所有这些连接在一起,并带有诸如自动复数之类的混淆事物。一件事小写或单数不正确,您会得到不正确的行为并且没有错误。不过,从你的 sn-p 来看,我乍一看一切都很好。
    • 您也有milestone_ids,这可能会让您感到困惑,并且看起来像是重复的。一旦您正确填充了milestones,我会将其从架构中删除并将其从您的数据中迁移出来。
    • 我检查了数据,看起来不错。我贴在帖子里了。有什么不对的地方吗?
    • 聊天链接不起作用。我想知道这是如何解决的。谢谢
    猜你喜欢
    • 2021-09-27
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2016-10-10
    • 2018-06-01
    • 2014-03-26
    相关资源
    最近更新 更多