[英]How to populate reference field in virtual method in Mongoose?
我有以下架構。
var ItemSchema = new Schema({
name : String
,location: {
address: { type: String, default:''},
geolocation: {longitude: Number, latitude:Number},
place : {type: Schema.Types.ObjectId, ref:'Place'}
},
ranking_in_place : Number })
Place是對Place模式的引用,它包含名稱,城市,國家等字段。
我想為ranking_summary創建一個虛擬的:
ItemSchema.virtual('ranking_summary').get(function() {
if(this.ranking_in_place <= 5){
if(this.ranking_in_place == 1){
return "Most popular item" + " in " + this.location.place.name
}
}
})
我無法獲取this.location.place.name值,因為this.location.place是一個引用,而不是填充。 我該如何訪問此值?
您確定要在查詢中調用.populate()嗎? 否則,Mongoose將不知道引入引用對象。 例:
ItemModel.findOne().populate('place').exec(function (err, item) {
console.log(item.ranking_in_place)
})
Model.find().populate(path, fields, conditions, options);
所以你可以使用的選項
{ sort: 'order' } // ascending
{ sort: [['order', 1 ]] } // ascending
{ sort: [['order', 'asc' ]] } // ascending
{ sort: [['order', 'desc' ]] } // ascending
{ sort: [['order', -1 ]] } // descending
{ sort: [['order', 'desc' ]] } // descending
{ sort: [['order', 'descending' ]] } // descending
我認為沒有直接的方法來做到這一點。 實現這一目標的一種方法是遵循鈎子。 [閱讀更多]
這是一個示例代碼。 我需要計算由視頻組成的教程的總時間。 所以,我不得不填充視頻,然后使用它們的持續時間來計算教程的totalTime。
tutorialSchema.pre('findOne', function (next) {
this.populate('videos'); // now available as this.ratings in this schema
next();
});
tutorialSchema.virtual('totalTime').get(function () {
let times = [];
times = this.videos.map((v) => {
return v.duration;
});
if(times.length === 0) return 0;
let totalTime = times.reduce((sum, time) => {
return sum + time;
});
return totalTime;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.