簡體   English   中英

如何在Mongoose中填充虛擬方法中的引用字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM