6

我有以下架构。

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 是一个参考,而不是填充。我怎样才能访问这个值?

4

3 回答 3

2

你确定在你的查询中调用.populate()吗?否则,Mongoose 将不知道拉入参考对象。例子:

ItemModel.findOne().populate('place').exec(function (err, item) {
    console.log(item.ranking_in_place)
})
于 2013-01-14T15:27:47.530 回答
1
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
于 2013-05-09T17:02:30.480 回答
1

我认为没有直接的方法可以做到这一点。实现此目的的一种方法是遵循钩子。[阅读更多]

这是一个示例代码。我需要计算由视频组成的教程的总时间。因此,我必须填充视频,然后使用它们的持续时间来计算教程的总时间。

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;
});
于 2017-12-08T17:50:10.857 回答