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

相关推荐
吴声子夜歌1 小时前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb
X Chow20 小时前
MongoDB Beginner Guide 01:理解 NoSQL、文档模型与 Python 开发环境
数据库·mongodb·nosql
前端双越老师21 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈
小李不困还能学21 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
Kel1 天前
Node.js 没那么复杂
人工智能·node.js·全栈
星栈独行1 天前
Node 接口该写同步还是异步?
服务器·开发语言·后端·程序人生·node.js
小大宇1 天前
mongoDB dump技巧
数据库·mongodb
吴声子夜歌1 天前
MongoDB 4.x——微服务入门
java·mongodb·微服务
曾阿伦2 天前
MongoDB 查询语句备忘手册
数据库·mongodb
星栈2 天前
Node 接口该写同步还是异步?
后端·node.js