Mongoose模型名与MongoDB集合名不一致却正常工作的原因
Mongoose模型与MongoDB集合名称映射机制解析
默认自动转换规则
Mongoose自带一套命名转换逻辑,用来关联模型名称和MongoDB的集合:- 把模型名称转为全小写
- 将单数形式的模型名转为复数
比如你用mongoose.model("Project", ...)定义模型,Mongoose会自动匹配到MongoDB里的projects集合;如果定义mongoose.model("User", ...),就会对应users集合,Material模型对应materials集合,这也是你用project模型能正常操作projects集合的原因。
关于Users、Materials集合的特殊情况
你代码里用user、material模型能操作MongoDB里的Users、Materials集合,大概率是因为数据库运行在Windows系统上——Windows的文件系统是大小写不敏感的,MongoDB在这种环境下会把users和Users、materials和Materials视为同一个集合。如果换成Linux或macOS(大小写敏感的系统),这种情况就会导致找不到集合的错误。
另外也有可能是你在定义Schema的时候,通过配置项手动指定了集合名,比如:
const userSchema = new mongoose.Schema({ // 字段内容 }, { collection: "Users" });
这种情况下模型会直接关联指定的集合,跳过自动转换逻辑。
- 手动指定集合名称的方式
如果不想依赖Mongoose的自动转换,想让模型和集合名称严格对应,只需要在创建Schema时加上collection配置项,就像上面的例子那样,这样模型就会直接绑定到你指定的集合上,不会做任何自动转换。
内容的提问来源于stack exchange,提问作者hansvdzz
相关产品推荐
相关产品推荐

