2015-06-24 49 views
-1

我有一個貓鼬模式User,並在那裏現場friends,引用再次,像這樣:貓鼬填充參考自己的<code>User</code>架構模式

var UserSchema = new Schema({ 
    name: String, 
    email: { type: String, lowercase: true }, 
    role: { 
    type: String, 
    default: 'user' 
    }, 
    friends: [{ type: Schema.Types.ObjectId, ref: 'User'}] 
}); 

這工作得很好,我可以看到該用戶的ID在數據庫中設置一些像這樣的後:

var test = new User({...}); 
var admin = new User({...}); 
var users = [test, admin]; 

User.find({}).remove(function() { 
    User.create(users, function() { 
    console.log('finished populating users'); 
    }); 
}); 

但現在我要得到一個單一的用戶,只是喜歡的文檔時,填充friends場,我這樣做:

exports.show = function (req, res, next) { 
    var userId = req.params.id; 

    User.findById(userId) 
    .populate('friends') 
    .exec(function (err, user) { 
     if (err) return next(err); 
     if (!user) return res.send(401); 
     res.json(user.profile); 
    }); 
}; 

但我只是得到正常/未填充的用戶ID回來!

我越來越覺得這是因爲用戶模式的自我參照,但ID在數據庫中出現的罰款...

建議的重複並不能真正幫助我,因爲我不即使使用那麼多嵌套,問題可能只是自我引用模式

任何想法?提前致謝!

+0

可能重複[mongoose遞歸填充](http://stackoverflow.com/questions/26041262/mongoose-recursive-populate) – B3rn475

+0

嗯,可能是,但我沒有比這更高的水平。這只是'填充()'不工作... – Kageetai

回答

1

好的,我發現問題出在哪裏。 user.profile是來自Mongoose的虛擬架構。所以我延伸說:

UserSchema 
    .virtual('profile') 
    .get(function() { 
    return { 
     '_id': this._id, 
     'name': this.name, 
     'role': this.role, 
     'friends': this.friends 
    }; 
    }); 

現在填充的friends工程!

0
User.findById(userId) 
.populate('friends', ['name', 'email']) 
.exec(function (err, user) { 
    if (err) return next(err); 
    if (!user) return res.send(401); 
    res.json(user.profile); 
    }); 

嘗試僅填寫必填字段(不包括「朋友」字段)的朋友以避免自我引用架構。

+0

這聽起來很合理。我想它試圖填充'朋友'的'朋友'呢? – Kageetai

+0

讓我知道這是否有效......如果它有效,PLZ接受/ upvote我的答案。 – sam100rav

+0

終於有時間來測試,但仍然無法正常工作...... -/ – Kageetai