[SchemaTypes]
模式類型處理路徑默認值、驗證、getter、setter、字段選擇默認值以及字符串和數(shù)字的其他一般特征。
以下是所有的有效SchemaTypes的mongoose。
- [字符串]
- [數(shù)量]
- [日期]
- [緩沖]
- 布爾
- 混合
- [ObjectId]
- [數(shù)組]
- 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:布爾或函數(shù),如果真正的添加一個[需要驗證器]為這個屬性 -
default:任何或函數(shù),設置一個默認值的路徑。如果該值是一個函數(shù),函數(shù)的返回值作為默認值。 -
select:布爾,指定默認值[預測]查詢 -
validate:添加一個函數(shù)[驗證器函數(shù)]為這個屬性 -
get:函數(shù),定義了該屬性使用一個定制的getter -
set:函數(shù),定義了該屬性使用一個定制的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:布爾,是否要定義一個[指數(shù)]在這個屬性。 -
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:創(chuàng)建一個正則表達式[驗證器]檢查如果匹配給定的正則表達式的值 -
enum:創(chuàng)建一個數(shù)組[驗證器]檢查值是否在給定的數(shù)組。 -
minlength:Number類型,創(chuàng)建一個[驗證器]檢查值長度是不是少于給定的數(shù)字 -
maxlength:Number類型,創(chuàng)建一個[驗證器]檢查值長度不大于給定的數(shù)字
數(shù)量
-
min:Number類型,創(chuàng)建一個[驗證器]檢查如果該值大于或等于給定的最小值。 -
max:Number類型,創(chuàng)建一個[驗證器]檢查值是否小于或等于給定的最大值。
日期
-
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“怎么都行”,其靈活性的平衡是很難維護?;旌峡梢允且韵氯N任何模式:Schema.Types、或通過傳遞一個空對象。以下是等價的:
var Any = new Schema({ any: {} });
var Any = new Schema({ any: Object });
var Any = new Schema({ any: Schema.Types.Mixed });
因為它是一種非模式化,你可以改變任何你喜歡的價值,但mongoose失去了能夠自動檢測并保存這些更改?!案嬖V”mongoose混合型的值發(fā)生了變化,調用.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
數(shù)組
提供創(chuàng)建數(shù)組[SchemaTypes];)或[子文檔]
var ToySchema = new Schema({ name: String });
var ToyBox = new Schema({
toys: [ToySchema],
buffers: [Buffer],
string: [String],
numbers: [Number]
// ... etc
});
數(shù)組是特殊的,因為他們暗中有默認值[](空數(shù)組)。
var Toy = mongoose.model('Test', ToySchema);
console.log((new Toy()).toys); // []
覆蓋這個默認情況下,您需要設置默認值undefined
var ToySchema = new Schema({
toys: {
type: [ToySchema],
default: undefined
}
});
注:指定一個空數(shù)組相當于Mixed。以下所有創(chuàng)建數(shù)組類型為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是你如何去創(chuàng)建一個嵌套文檔的任意鍵。
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的插入順序屬性。
[創(chuàng)建自定義類型]
mongoose也可以通過自定義SchemaTypes擴展。搜索[插件]網站兼容的類型,[其他])[類型]
[schema.path()函數(shù)]
schema.path()函數(shù)返回給定路徑的模式類型實例化。
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: ...
*/
您可以使用此函數(shù)檢查給定路徑的模式類型,包括驗證器和類型是什么。
[接下來]
現(xiàn)在我們已經介紹了SchemaTypes,接下來讓我們看一下connections