【问题标题】:Mongoose 'populate' not populating猫鼬'填充'不填充
【发布时间】:2015-07-13 16:22:21
【问题描述】:

我正在 MEAN 堆栈上构建一个相当简单的应用程序,但我真的超出了我的能力范围,尤其是在 mongoose 方面。我发现 mongoose 文档很难理解,并且在其他任何地方都找不到答案。

我的问题是:我有一堆用户,这些用户有存储库,而存储库有存储库提供程序(GitHub、BitBucket 等)。

一个用户有很多仓库,一个仓库只有一种仓库类型。

我的用户文件包含以下内容:

var mongoose = require('mongoose'),
Schema   = mongoose.Schema; 

var UserSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    repositories: [{
        name: String,
        branches: [{
            name: String,
            head: Boolean,
            commits: [{
                hash: String,
                date: Date,
                message: String,
                contributer: String,
                avatar: String
            }]
        }],
        repoType: { 
            type: Schema.Types.ObjectId, 
            ref: 'RepoProviders'
        }
    }]
});

var User = mongoose.model('User', UserSchema);

module.exports = User;

// This is where the magic doesn't happen :(

User.find({ name: "John Smith"}).populate({path: 'repoType'}).exec(function (err, user) {
  if (err) return handleError(err);
  console.log(user);
});

RepoProvider.js 包含:

var mongoose = require('mongoose');
Schema = mongoose.Schema;

var RepoProviderSchema = new Schema({
    name: {
        type: String,
        required: true
    }
});

var RepoProvider = mongoose.model('RepoProviders', RepoProviderSchema);
module.exports = RepoProvider;

我在 mongo 中创建用户文档并手动分配 repoType id 哈希(取自现有的 repoType 文档)。

当我 console.log 用户时,repo 类型设置为 id 但没有返回任何关系:

[ { _id: 5547433d322e0296a3c53a16,
    email: 'john@smith.com',
    name: 'John Smith',
    __v: 0,
    repositories: 
     [ { name: 'RepoOne',
         repoType: 5547220cdd7eeb928659f3b8,
         _id: 5547433d322e0296a3c53a17,
         branches: [Object] } ] } ]

如何正确设置和查询这种关系?

【问题讨论】:

    标签: mongoose mean-stack mongoose-populate


    【解决方案1】:

    您需要在populate方法中指定repoType的完整路径:

    User.find({ name: "John Smith"}).populate({path: 'repositories.repoType'}).exec(function (err, user) {
      if (err) return handleError(err);
      console.log(user);
    });
    

    【讨论】:

    • 天哪……你知道我在这上面花了多长时间吗?!归根结底! Ugggh...我已经准备好尖叫着回到 PHP。非常感谢您的帮助!
    • :D Mongoose 可能会对稀疏的文档感到困惑,但该项目最近已过渡,新的维护人员正在努力解决这个问题(以及许多其他事情)。
    • 啊好消息!拥有一个包含完整示例的简单“入门指南”真的很有帮助,这些都不能填补他们文档中目前正在发生的空白废话。
    猜你喜欢
    • 2016-10-10
    • 2015-07-13
    • 2020-01-17
    • 2021-05-06
    • 2019-06-05
    • 2019-09-16
    • 2021-05-03
    • 2021-01-09
    相关资源
    最近更新 更多