能否在Mongoose的virtual属性get方法中执行查询操作?
问题原因说明
你写的异步virtual getter确实无法正常生效,因为Mongoose的virtual getter原生设计为同步执行逻辑,不会等待异步函数返回的Promise完成,直接访问review属性只会拿到Pending状态的Promise对象,无法得到预期的查询结果。
可行替代方案
方案1:使用Mongoose官方虚拟Populate (最推荐)
这是Mongoose专门为关联查询场景设计的特性,完全匹配你的需求,配置方式如下:
bookSchema.virtual("review", { ref: "Review", // 对应Review模型的模型名 localField: "_id", // Book模型中用来关联的字段 foreignField: "book_id", // Review模型中存储关联BookID的字段 justOne: true // 匹配你原逻辑中findOne只返回单条结果的设定 });使用时在查询Book的语句中加上populate调用即可:
// 查询时自动关联加载review const book = await Book.findOne({ _id: 你的书籍ID }).populate("review"); // 访问book.review即可得到关联的Review数据,无匹配时为null,可自行转换为false如果需要每次查询Book都自动加载review,可添加pre查询钩子统一处理:
bookSchema.pre(["find", "findOne"], function(next) { this.populate("review"); next(); });方案2:定义异步实例方法
如果你需要在获取review的逻辑中添加额外自定义处理,可以将逻辑封装为文档实例的异步方法:
bookSchema.methods.getReview = async function () { const data = await Review.findOne({ book_id: this._id }); return data || false; };使用方式如下:
const book = await Book.findOne({ _id: 你的书籍ID }); const review = await book.getReview(); // 直接拿到处理后的结果
内容的提问来源于stack exchange,提问作者Aditya rawat
相关产品推荐
相关产品推荐

