Mongoose find()查询中用变量调用模型:解决返回undefined问题
解决Mongoose中用变量传入模型名执行find()的问题
我来帮你搞定这个问题!你遇到的问题根源是用错了引用Mongoose模型的方式——[schemaName]本质是创建了一个包含字符串的数组,数组根本没有find()方法,所以自然返回undefined。下面给你两种可行的解决方案:
方案1:直接使用已导入的模型变量
如果你已经通过require拿到了模型,直接用这个变量就好,完全不需要额外的字符串变量:
var Collection1 = require('...schema路径'); // 直接用导入的模型调用find() var cursor = Collection1.find().cursor();
方案2:动态通过模型名字符串获取模型(适合动态场景)
如果你的业务场景确实需要用字符串动态指定模型名,要通过Mongoose的mongoose.model()方法来获取已注册的模型,步骤如下:
第一步:确保你的Schema文件正确注册了模型
在你的schema文件里,必须用mongoose.model()把模型注册到Mongoose实例中,第一个参数就是模型的名称(要和你后面用的schemaName完全一致):
const mongoose = require('mongoose'); // 定义你的Schema const collectionSchema = new mongoose.Schema({ // 你的字段定义,比如: name: String, createdAt: Date }); // 注册模型,第一个参数是模型名,后续通过这个名字获取 module.exports = mongoose.model('Collection1', collectionSchema);
第二步:在主代码中通过字符串获取模型并执行查询
const mongoose = require('mongoose'); // 先导入模型文件,确保模型被注册到Mongoose中 require('...schema路径'); var schemaName = 'Collection1'; // 通过模型名字符串获取模型实例 const TargetModel = mongoose.model(schemaName); // 现在可以正常调用find()了 var cursor = TargetModel.find().cursor();
注意事项
- 模型名要完全匹配:
schemaName的字符串必须和你注册模型时传入的第一个参数完全一致(包括大小写),否则Mongoose找不到对应的模型。 - 必须先注册模型:如果没有提前导入schema文件(也就是没执行注册模型的代码),
mongoose.model(schemaName)会返回undefined,这点要特别注意。
内容的提问来源于stack exchange,提问作者JoaoFilipeClementeMartins
相关产品推荐
相关产品推荐

