Mongoose操作schema时默认表名添加s以及解决

本文详细解析了Mongoose中model方法如何默认处理模型名以生成集合名,并提供了避免此默认处理的方法,确保数据库表名符合预期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在操作Mongose时,编写一个schema,结果查询出的结果数据的长度是0,很郁闷,编写的schmea代码如下:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PageSchema = new Schema({
    name: { type: String, default: '' },
    id: { type: Number},
    pageno: { type: String, default: '1' },
    modelType:{type:String}
});
exports.Page= mongoose.model('Page',PageSchema);
    结合之前的操作,在使用mongoose.model设置表Page时,发现mongoose实际上操作的表为pages,查看
mongoose.model的源码,发现默认会给page默认添加s.源码如下,
Mongoose的model方法有四个参数:name为模型model的名称;
schema为mongodb的document映射的schema;
collection为真正的collection名称;
skipInit为是否跳过初始化,默认为false.
当collection缺失时,该方法会将name参数根据一定的规则转换成Mongodb中的collection的名称。参见以下代码:
if (!collection) {
    collection = schema.get('collection') || format(name, schema.options);
  }
上文中format(name,schema.options)即为将model的name属性转换为collection的名称的方法,实际上是调用
utils.toCollectionName。访问该方法的内部,源代码如下:
/*!
 * Produces a collection name from model `name`.
 *
 * @param {String} name a model name
 * @return {String} a collection name
 * @api private
 */

exports.toCollectionName = function (name, options) {
  options = options || {};
  if ('system.profile' === name) return name;
  if ('system.indexes' === name) return name;
  if (options.pluralization === false) return name;
  return pluralize(name.toLowerCase());
};
实际上是
pluralize(name.toLowerCase())方法在起作用,该方法主要将model的name转换成collection的name。但是,对于model名称的转换分为两部分:不需要转换的模型名称和需要进行处理的模型名称,
其中,不需要进行转换的名称只有以下列表:
exports.uncountables = [
  'advice',
  'energy',
  'excretion',
  'digestion',
  'cooperation',
  'health',
  'justice',
  'labour',
  'machinery',
  'equipment',
  'information',
  'pollution',
  'sewage',
  'paper',
  'money',
  'species',
  'series',
  'rain',
  'rice',
  'fish',
  'sheep',
  'moose',
  'deer',
  'news',
  'expertise',
  'status',
  'media'
];
需要转换的名称的转换规则如下:
exports.pluralization = [
  [/(m)an$/gi, '$1en'],
  [/(pe)rson$/gi, '$1ople'],
  [/(child)$/gi, '$1ren'],
  [/^(ox)$/gi, '$1en'],
  [/(ax|test)is$/gi, '$1es'],
  [/(octop|vir)us$/gi, '$1i'],
  [/(alias|status)$/gi, '$1es'],
  [/(bu)s$/gi, '$1ses'],
  [/(buffal|tomat|potat)o$/gi, '$1oes'],
  [/([ti])um$/gi, '$1a'],
  [/sis$/gi, 'ses'],
  [/(?:([^f])fe|([lr])f)$/gi, '$1$2ves'],
  [/(hive)$/gi, '$1s'],
  [/([^aeiouy]|qu)y$/gi, '$1ies'],
  [/(x|ch|ss|sh)$/gi, '$1es'],
  [/(matr|vert|ind)ix|ex$/gi, '$1ices'],
  [/([m|l])ouse$/gi, '$1ice'],
  [/(kn|w|l)ife$/gi, '$1ives'],
  [/(quiz)$/gi, '$1zes'],
  [/s$/gi, 's'],
  [/([^a-z])$/, '$1'],
  [/$/gi, 's']
];
解决表名默认处理的方法:
 如果不想使用model方法默认的model的name转换为collection的name,则只需要传递三个参数即可,其中最后一个参数真正的collection的name.如:
exports.Page= mongoose.model('Page',PageSchema,"PAGES");//其中PAGES为数据库中的collection的名称


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值