如何在Mongoose Schema实例方法中使用当前Schema模型
解决Mongoose实例方法中查询同模型文档的问题
有两种靠谱的方案可以解决你遇到的问题,不用导入当前文件的模型:
方案1:通过this.constructor获取模型
Mongoose的文档实例自带constructor属性,它直接指向该实例所属的模型。你可以在实例方法里用这个属性调用模型的查询方法,比如find、findById。
示例代码:
const mongoose = require('mongoose'); const messageSchema = new mongoose.Schema({ content: String, threadId: String, // 用于关联同线程的消息 createdAt: Date }); // 定义实例方法:获取当前消息所属线程的其他消息 messageSchema.methods.getRelatedMessages = async function() { // this 是当前消息文档实例,this.constructor 就是 Message 模型 return await this.constructor.find({ threadId: this.threadId, _id: { $ne: this._id } // 排除当前消息本身 }).sort({ createdAt: 1 }); }; const Message = mongoose.model('Message', messageSchema); module.exports = Message;
方案2:直接通过mongoose.model()获取已注册的模型
如果你的模型已经通过mongoose.model()注册过(也就是已经执行过创建模型的代码),可以直接在实例方法里用mongoose.model('模型名称')获取模型,再调用查询方法。
示例代码:
messageSchema.methods.getRelatedMessages = async function() { const Message = mongoose.model('Message'); return await Message.find({ threadId: this.threadId, _id: { $ne: this._id } }); };
注意事项
- 方案1更可靠,因为它不依赖模型的注册时机,直接从当前实例获取所属模型,能避免循环引用问题;
- 不要用
require导入当前文件的模型,这会引发循环引用,在大型项目里很容易导致报错。
内容的提问来源于stack exchange,提问作者Jacob Hornbeck
相关产品推荐
相关产品推荐

