node.js mongoose schemaTypes

目录

官方文档

简介

SchemaType

示例

配置SchemaType规则

通用规则

特定schemaType规则

String

Number

Date

Map

monggose会根据shcemaType将文档值转换成指定的类型


官方文档

Mongoose v8.0.3: SchemaTypes

简介

SchemaTypes是在使用Mongoose时,用于定义MongoDB文档模型中字段的数据类型的一种概念。在Mongoose中,每个字段都有一个关联的SchemaType,它定义了该字段的数据类型、验证规则等信息。

SchemaType

String、Number、Date、Buffer、Boolean、ObjectId、Array、Map、Dcimal128、Schema、Mixed、UUID

示例

javascript 复制代码
const schema = new mongoose.Schema({
  name: String,
  binary: Buffer,
  living: Boolean,
  updated: { type: Date, default: Date.now },
  age: { type: Number, min: 18, max: 65 },
  mixed: mongoose.Schema.Types.Mixed,
  _someId: mongoose.Schema.Types.ObjectId,
  decimal: mongoose.Schema.Types.Decimal128,
  array: [],
  ofString: [String],
  ofNumber: [Number],
  ofDates: [Date],
  ofBuffer: [Buffer],
  ofBoolean: [Boolean],
  ofMixed: [mongoose.Schema.Types.Mixed],
  ofObjectId: [mongoose.Schema.Types.ObjectId],
  ofArrays: [[]],
  ofArrayOfNumbers: [[Number]],
  nested: {
    stuff: { type: String, lowercase: true, trim: true }
  },
  map: Map,
  mapOfString: {
    type: Map,
    of: String
  }
});

// example use

const Thing = mongoose.model('Thing', schema);

const m = new Thing;
m.name = 'Statue of Liberty';
m.age = 50;
m.updated = new Date;
m.binary = Buffer.alloc(0);
m.living = false;
m.mixed = { wang: { thing: 'i want' } };
m.markModified('mixed');
m._someId = new mongoose.Types.ObjectId;
m.array.push(1);
m.ofString.push('strings!');
m.ofNumber.unshift(1, 2, 3, 4);
m.ofDates.addToSet(new Date);
m.ofBuffer.pop();
m.ofMixed = [1, [], 'three', { four: 5 }];
m.nested.stuff = 'good';
m.map = new Map([['key', 'value']]);
m.save();

配置SchemaType规则

通用规则

  • required:布尔或函数,如果为true,则代表该值必传
  • default: 默认值
  • select:布尔,查询时是否投影
  • validate:函数,属性值验证
  • get: 函数,使用 Object.defineProperty() 定义该属性的自定义 getter
  • set:函数,使用 Object.defineProperty() 定义该属性的自定义 setter
  • alias:字符串,定义一个虚拟属性用于get、set此path
  • immutable:布尔、设置此path的值不可更改
  • index:布尔,是否将此属性设置索引,提高查询文档的速度
  • unique:布尔,是否将此值定义为该集合唯一的属性值
javascript 复制代码
const mongoose = require('mongoose');
const schema = new mongoose.Schema({
  name: {
    type: String,
    select: true,
    required: true,
    validate: v => v.length > 4,
    get: v => v +"aaaa",
    set: v => "aaaa" + v,
    alias: 'i',
    immutable: true
  }
});
const CatModel = mongoose.model('Cat', schema);

async function stduyFn() {
  const cat = new CatModel({name: 'sss'});
  try {
    await cat.save();
    cat.name = '111111'
    cat.i = 'dadsadas'
    await cat.save();
    console.log(cat.name)
  } catch (err) {
  }
}

stduyFn()

alias会添加一个虚拟属性,映射到path为name上,当设置immutable为true,更改cat.i和cat.name并不会成功更改。

查看SchemaType配置,关系

mongoose.SchemaType是所有SchemaTyps的基类,schema.path('field')是SchemaTyps的实例

javascript 复制代码
console.log(schema.path('name'))
console.log(mongoose.Schema.Types.String.prototype.__proto__ ==  mongoose.SchemaType.prototype) // true
console.log(schema.path('name') instanceof mongoose.SchemaType) // true
console.log(schema.path('name') instanceof mongoose.Schema.Types.String) // true

特定schemaType规则

String
  • lowercase: 布尔,是否始终对值调用 .toLowerCase()。如果设置为 true,则始终将值转换为小写
  • uppercase: 布尔,是否始终对值调用 .toUpperCase()。如果设置为 true,则始终将值转换为大写
  • trim: 布尔,是否始终对值调用 .trim()。如果设置为 true,则始终将值的前导和尾随空格去除。
  • match: 正则表达式,检查值是否与给定的正则表达式匹配
  • enum: 数组,该数组列出了值的所有可能取值
  • minLength: 数字,检查值的长度是否不小于给定的数字
  • maxLength: 数字,检查值的长度是否不大于给定的数字
Number
  • min: 数字,检查值是否大于或等于给定的最小值
  • max: 数字,检查值是否小于或等于给定的最大值
  • enum: 数组,检查值是否严格等于给定数组中的一个值
Date
  • min: 日期,检查值是否大于或等于给定的最小日期
  • max: 日期,创建一个验证器,检查值是否小于或等于给定的最大日期
Map
  • of:map的key类型默认为String,可以用of指定SchemaType

monggose会根据shcemaType将文档值转换成指定的类型

转Number

javascript 复制代码
const mongoose = require('mongoose');
const schema = new mongoose.Schema({
  age: Number,
});
const Car = mongoose.model('Car', schema);

async function stduyFn() {
  const cat = new Car({ age: '15' });
  const cat1 = new Car({ age: true })
  const cat2 = new Car({ age: false })
  const cat3 = new Car({ age: { valueOf: () => 83 } })
  try {
    await cat.save();
    await cat1.save();
    await cat2.save();
    await cat3.save();
  } catch (err) {
  }
}
stduyFn()

转String

javascript 复制代码
const mongoose = require('mongoose');
const schema = new mongoose.Schema({
  number: Number,
});
const Car = mongoose.model('Car', schema);

async function stduyFn() {
  const cat = new Car({ number: '1666' });
  const cat1 = new Car({ number: 1555 });
  const cat2 = new Car({ number: { valueOf: () => 1032 } })
  try {
    await cat.save();
    await cat1.save();
    await cat2.save();
  } catch (err) {
  }
}
stduyFn()

转Boolean

​true、'true'、1、'1'、'yes'都为true,false、'false'、0、'0'、'no' 都为false

相关推荐
理想不理想v5 分钟前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript
马剑威(威哥爱编程)2 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
掘金-我是哪吒2 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
全能全知者4 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
齐 飞4 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
暮毅4 小时前
10.Node.js连接MongoDb
数据库·mongodb·node.js
~甲壳虫10 小时前
说说webpack中常见的Plugin?解决了什么问题?
前端·webpack·node.js
~甲壳虫10 小时前
说说webpack中常见的Loader?解决了什么问题?
前端·webpack·node.js
~甲壳虫10 小时前
说说webpack proxy工作原理?为什么能解决跨域
前端·webpack·node.js
熊的猫11 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js