Express JS:如何让查询等待Mongonese虚拟属性的返回结果



我尝试在没有引用ID的虚拟属性中查询其他Schema,发现返回的结果不包括该虚拟属性。函数populate((不能使用,因为两个架构没有链接,对吗?什么方法可以让查询等到结果准备好后再返回?

member.js

var MemberSchema = new Schema(
{
name: {type: String, maxlength: 100},
joinYear: {type: Number, min: 1980}
}
);

// Virtual that can be found in query result
PatientSchema
.virtual('url')
.get(function () {
return '/member/' + this._id;
});

// Virtual that cannot be found in query result, but console.log display correct value
// it try to count documents of Event Schema, that happened same year as member join.
MemberSchema
.virtual('eventInJoinYearCount')
.get(function () {
Event.countDocuments({eventYear:this.joinYear})
.then((myCount) =>{console.log(myCount); return myCount}); 

//query result included virtual properties
MemberSchema.set('toObject', { getters: true });

//Export model
module.exports = mongoose.model('Member', MemberSchema);

memberController.js 中应用的member.find函数

exports.search = function(req, res,next) {   
async.parallel({
memberList: function(callback) {
Member.find({"name": {$regex: ".*"+req.query.FindString, $options:"i"}}).exec(callback);
},      
}, function(err, results) {
console.log(results);
res.render('index', { error: err, data: results });
});
};

最后我发现populate函数仍然足够强大,可以处理这种情况。

这是我修改的虚拟财产

//get 
MemberSchema
.virtual('eventInJoinYearCount',{
ref: 'Event', // The model to use
localField: 'joinYear', // Find people where `localField`
foreignField: 'eventYear', // is equal to `foreignField`
count: true // And only get the number of docs
});

和修改后的控制器

exports.search = function(req, res,next) {   
async.parallel({
memberList: function(callback) {
Member.find({"name": {$regex: ".*"+req.query.FindString, $options:"i"}}).populate('eventInJoinYearCount').exec(callback);
},      
}, function(err, results) {
console.log(results);
res.render('index', { error: err, data: results });
});
};

最新更新