Mongoose填充未定义的字段

时间:2016-09-20 09:01:22

标签: javascript node.js mongodb mongoose mongoose-populate

我看到很多关于这方面的问题,但我无法找到问题所在。当我使用populate获取"外键"我的领域未定义。

用户模型

var userSchema = new Schema({
    email        : { type: String, required: true, unique: true },
    password     : { type: String, required: true },
    firstname    : { type: String, required: true },
    lastname     : { type: String, required: true },
    created_at   : Date,
    updated_at   : Date,
    office       : [ { type: Schema.Types.ObjectId, ref: 'Office' } ]
});

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

module.exports = User;

Office模型:

var officeSchema = new Schema({
    name        : { type: String, required: true },
    address     : String,
    city        : String,
    geolocation : [ { type: Schema.Types.ObjectId, ref: 'Geolocation' } ],
    company     : [ { type: Schema.Types.ObjectId, ref: 'Company' } ]
});

var Office = mongoose.model('Office', officeSchema, 'Office');

module.exports = Office;

填充代码:

User.find({})
.populate('office')
//.populate('office', 'name') I tried this too
.exec(function (err, users) {
    if (err) return handleError(err);

    users.forEach(function(user){
        console.log('Office name: ', user.office.name);
    });
});

我想获取用户的办公室名称。但是这个user.office.name返回我未定义的,当我这样做user.office时,我可以看到带有name字段的对象。但我无权访问域名。

2 个答案:

答案 0 :(得分:2)

office中的userSchema字段定义为数组。因此,要访问其元素,请使用user.office[0].nameuser.office[1].name

否则,请使用循环:

user.office
    .forEach(function(each) {
        console.log('Office name: ', each.name);
    });

答案 1 :(得分:1)

您只需将查询编辑为

即可
 populate({path: "office", populate: {path:"company"}})

它还会填充公司数据。