首页 > 技术文章 > 【Mongodb】mongoDB与mongoose---Scheme和Collections对应问题

AdamFamily 2019-10-16 09:56 原文

mongodb是一个基于分布式文件存储的文档型数据库

MongoDB 是一个介于关系数据库和非关系数据库之间的产品

MongoDB 最大的特点是他支持的查询语言非常强大,而且还支持对数据建立索引

官方网址:https://www.mongodb.com/

常用的关系型数据库有Sql Server、mysql、Oracle

 

特点:

非关系型的、分布式的、开源的、水平可扩展的

 

适用场景:

(1)网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性

(2)缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。

(3)大尺寸,低价值的数据

(4)高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库

(5)用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询

 

安装:

1、找到所安装的目录

比如E:\BJ\web\bosh\DB,输入mongod 按tab补全,然后输入 --dbpath = 数据库存放的位置--port=27017

//27017是mongodb默认

2、重新打开窗口使用npm i 进行安装

3、输入npm run dev 运行服务

4、安装成功,输入localhost:80进行访问 

 

mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具

mongoose是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的、增删改查等方法

网址:网址:http://mongoosejs.com

 

安装:

npm install mongoose --save-dev

 

Mongodb通过mongoose来与数据进行操作。而mongoose是通过model来创建数据库中对应的collection

mongoose.model('User', UserSchema);

 在相应的数据库中创建一个collection时,第一反应肯定会推断在对应的数据库中会建立一个‘User’的collection

NO!

大家可以尝试一下,模型名改为User、Money、Box试试看结果……

其实Mongoose在模型名至数据库集合名的命名转换上做了文章。Collection的命名做了复数和不可数处理

查看Mongoose框架的源代码,看看作者是如何做集合命名规范的, 位于mongoose/lib/util.js模块中如下代码片段是集合命名的根源。

复制代码
/*!
 * 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());
};
/**
 * Pluralization rules.
 *
 * These rules are applied while processing the argument to `toCollectionName`.
 *
 * @deprecated remove in 4.x gh-1350
 */
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'],
  [/(quiz)$/gi, '$1zes'],
  [/s$/gi, 's'],
  [/([^a-z])$/, '$1'],
  [/$/gi, 's']
];
var rules = exports.pluralization;
/**
 * Uncountable words.
 *
 * These words are applied while processing the argument to `toCollectionName`.
 * @api public
 */
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'
];
var uncountables = exports.uncountables;
/*!
 * Pluralize function.
 *
 * @author TJ Holowaychuk (extracted from _ext.js_)
 * @param {String} string to pluralize
 * @api private
 */
function pluralize (str) {
    var rule, found;
    if (!~uncountables.indexOf(str.toLowerCase())){
      found = rules.filter(function(rule){
        return str.match(rule[0]);
      });
      if (found[0]) return str.replace(found[0][0], found[0][1]);
    }
  return str;
};

复制代码

上面代码 对集合名称做了处理,uncountables是不可数名词,rules是一组正则匹配规则。   

 function pluralize(str)方法的处理思路是:

      1.判断模型名是否是不可数的,如果是直接返回模型名;否则进行复数转化正则匹配;

      2.返回复数转化正则匹配结果(一个复数转化正则匹配是一个数组,有两个对象,[0]正则表达式,[1]匹配后处理结果);

      3.如果复数转化正则匹配结果不存在,直接返回模型名;否则取匹配结果第一个,对模型名进行处理。(需要说明的是,rules是按特殊到一般的顺序排列的)

 如果想模型对应制定的collection,可以这样解决

复制代码
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var BannerSchema = new Schema({
  ……
  …… }, {collection : 'banner'}); module.exports = mongoose.model('Banner', BannerSchema);
复制代码

 

 

推荐阅读