1.mongoose schema

[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);

上面的例子中沒有顯式地聲明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的插入順序屬性。

[創(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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評論 19 139
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,692評論 0 4
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,179評論 2 9
  • ??引用類型的值(對象)是引用類型的一個實例。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結構,用于將數(shù)...
    霜天曉閱讀 1,227評論 0 1
  • 我想要成為的唯一 媽媽最愛最關心的女兒 爺奶最疼的孫女 好友aa最親密的朋友,足夠的重視 男票最難忘,最深愛的女人...
    runningbubu閱讀 216評論 0 0

友情鏈接更多精彩內容