今天在操作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的名称

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

被折叠的 条评论
为什么被折叠?



