[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);
上面的例子中没有显式地声明github
或twitter
路径,但是,因为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