1.mongoose schema

[SchemaTypes]

模式类型处理路径默认值、验证、getter、setter、字段选择默认值以及字符串和数字的其他一般特征。

以下是所有的有效SchemaTypes的mongoose。

  • [字符串]
  • [数量]
  • [日期]
  • [缓冲]
  • 布尔
  • 混合
  • [ObjectId]
  • [数组]
  • Decimal128
  • [Map]

例子

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

// example usevar Thing = mongoose.model('Thing', schema);

var m = new Thing;
m.name = 'Statue of Liberty';
m.age = 125;
m.updated = newDate;
m.binary = new Buffer(0);
m.living = false;
m.mixed = { any: { 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(newDate);
m.ofBuffer.pop();
m.ofMixed = [1, [], 'three', { four: 5 }];
m.nested.stuff = 'good';
m.map = newMap([['key', 'value']]);
m.save(callback);

[SchemaType选项]

您可以使用类型直接声明模式类型,或者具有类型属性的对象。

var schema1 = new Schema({
  test: String// `test` is a path of type String
});

var schema2 = new Schema({
  test: { type: String } // `test` is a path of type string
});

除了类型属性,你可以指定路径的附加属性。例如,如果你想要小写保存前一个字符串:

var schema2 = new Schema({
  test: {
    type: String,
    lowercase: true// Always convert `test` to lowercase
  }
});

lowercase只适用于字符串属性。有一些适用于所有模式类型的选项,以及一些适用于特定模式类型的选项。

所有模式类型
  • required:布尔或函数,如果真正的添加一个[需要验证器]为这个属性
  • default:任何或函数,设置一个默认值的路径。如果该值是一个函数,函数的返回值作为默认值。
  • select:布尔,指定默认值[预测]查询
  • validate:添加一个函数[验证器函数]为这个属性
  • get:函数,定义了该属性使用一个定制的getter
  • set:函数,定义了该属性使用一个定制的setter
  • alias:字符串,mongoose> = 4.10.0。定义了一个[virtual]的名字拿到/设置这个path。
var numberSchema = new Schema({
  integerOnly: {
    type: Number,
    get: v => Math.round(v),
    set: v => Math.round(v),
    alias: 'i'
  }
});

varNumber = mongoose.model('Number', numberSchema);

var doc = newNumber();
doc.integerOnly = 2.001;
doc.integerOnly; // 2
doc.i; // 2
doc.i = 3.001;
doc.integerOnly; // 3
doc.i; // 3
索引

您还可以定义[MongoDB索引]使用模式类型的选择。

  • index:布尔,是否要定义一个[指数]在这个属性。
  • unique:布尔,是否要定义一个[唯一索引]在这个属性。
  • sparse:布尔,是否要定义一个[稀疏索引]在这个属性。
var schema2 = new Schema({
  test: {
    type: String,
    index: true,
    unique: true// Unique index. If you specify `unique: true`// specifying `index: true` is optional if you do `unique: true`
  }
});

字符串
  • lowercase:布尔,是否总是为这个值调用.toLowerCase()方法
  • uppercase:布尔,是否总是为这个值调用.toUpperCase()方法
  • trim:布尔,是否总是为这个值调用.trim()方法
  • match:创建一个正则表达式[验证器]检查如果匹配给定的正则表达式的值
  • enum:创建一个数组[验证器]检查值是否在给定的数组。
  • minlength:Number类型,创建一个[验证器]检查值长度是不是少于给定的数字
  • maxlength:Number类型,创建一个[验证器]检查值长度不大于给定的数字
数量
  • min:Number类型,创建一个[验证器]检查如果该值大于或等于给定的最小值。
  • max:Number类型,创建一个[验证器]检查值是否小于或等于给定的最大值。
日期
  • min:Date类型
  • max:Date类型

[使用笔记]

日期

内置的日期方法不会被连接到mongoose的变化跟踪逻辑中,在英语中,如果你在你的文档中使用一个日期,并使用setMonth()这样的方法修改它,那么mongoose将不会意识到这个变化,而doc.save()将不会这种修改。
如果您必须使用内置的方法修改日期类型,请在保存之前告诉mongoose关于更改的(“pathToYourDate”)。

var Assignment = mongoose.model('Assignment', { dueDate: Date });
Assignment.findOne(function (err, doc) {
  doc.dueDate.setMonth(3);
  doc.save(callback); // THIS DOES NOT SAVE YOUR CHANGE

  doc.markModified('dueDate');
  doc.save(callback); // works
})

混合

SchemaType“怎么都行”,其灵活性的平衡是很难维护。混合可以是以下三种任何模式:Schema.Types、或通过传递一个空对象。以下是等价的:

var Any = new Schema({ any: {} });
var Any = new Schema({ any: Object });
var Any = new Schema({ any: Schema.Types.Mixed });

因为它是一种非模式化,你可以改变任何你喜欢的价值,但mongoose失去了能够自动检测并保存这些更改。“告诉”mongoose混合型的值发生了变化,调用.markModified(path)方法混合类型文档的传递路径就改变了。

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

objectid

指定一个类型的ObjectId,使用Schema.Types.ObjectId在你的类型声明中。

var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;
var Car = new Schema({ driver: ObjectId });
// or just Schema.ObjectId for backwards compatibility with v2

数组

提供创建数组[SchemaTypes];)或[子文档]

var ToySchema = new Schema({ name: String });
var ToyBox = new Schema({
  toys: [ToySchema],
  buffers: [Buffer],
  string:  [String],
  numbers: [Number]
  // ... etc
});

数组是特殊的,因为他们暗中有默认值[](空数组)。

var Toy = mongoose.model('Test', ToySchema);
console.log((new Toy()).toys); // []

覆盖这个默认情况下,您需要设置默认值undefined

var ToySchema = new Schema({
  toys: {
    type: [ToySchema],
    default: undefined
  }
});

注:指定一个空数组相当于Mixed。以下所有创建数组类型为Mixed:

var Empty1 = new Schema({ any: [] });
var Empty2 = new Schema({ any: Array });
var Empty3 = new Schema({ any: [Schema.Types.Mixed] });
var Empty4 = new Schema({ any: [{}] });

Map

mongoose5.1.0

一个MongooseMap是内置的一个子类[Map类]。在这些文档,我们将使用术语“Map”和MongooseMap互换。在mongoose,Map是你如何去创建一个嵌套文档的任意键。

const userSchema = new Schema({
  // `socialMediaHandles` is a map whose values are strings. A map's// keys are always strings. You specify the type of values using `of`.
  socialMediaHandles: {
    type: Map,
    of: String
  }
});

const User = mongoose.model('User', userSchema);
// Map { 'github' => 'vkarpov15', 'twitter' => '@code_barbarian' }console.log(new User({
  socialMediaHandles: {
    github: 'vkarpov15',
    twitter: '@code_barbarian'
  }
}).socialMediaHandles);

上面的例子中没有显式地声明githubtwitter路径,但是,因为socialMediaHandles是一个map,您可以存储任意键/值对。然而,由于socialMediaHandles是map,您必须使用.get()一个关键的值的“key”和.set()设置一个关键的值的“key”。

const user = new User({
  socialMediaHandles: {}
});

// Good
user.socialMediaHandles.set('github', 'vkarpov15');

// Works too
user.set('socialMediaHandles.twitter', '@code_barbarian');

// Bad, the `myspace` property will **not** get saved
user.socialMediaHandles.myspace = 'fail';

// 'vkarpov15'
console.log(user.socialMediaHandles.get('github'));

// '@code_barbarian'
console.log(user.get('socialMediaHandles.twitter'));

// undefined
user.socialMediaHandles.github;

// Will only save the 'github' and 'twitter' properties
user.save();

在MongoDB中,Map类型被存储为BSON对象。
BSON对象中的键是有序的,因此这意味着保留了map的插入顺序属性。

[创建自定义类型]

mongoose也可以通过自定义SchemaTypes扩展。搜索[插件]网站兼容的类型,[其他])[类型]

[schema.path()函数]

schema.path()函数返回给定路径的模式类型实例化。

var sampleSchema = new Schema({ name: { type: String, required: true } });
console.log(sampleSchema.path('name'));
// Output looks like:/**
 * SchemaString {
 *   enumValues: [],
 *   regExp: null,
 *   path: 'name',
 *   instance: 'String',
 *   validators: ...
 */

您可以使用此函数检查给定路径的模式类型,包括验证器和类型是什么。

[接下来]

现在我们已经介绍了SchemaTypes,接下来让我们看一下connections

你可能感兴趣的:(1.mongoose schema)