mongoose文档(三)(译)

SchemaTypes为所有查询处理defaults,validation,getters,setters,field selection defaults的定义,以及为字符串和数字处理一般特征。有关更多详细信息,请查看各自的API文档。

以下是所有有效的模式类型:

  • String
  • Numner
  • Date
  • Buffer
  • Bollean
  • Mixed
  • Objectid
  • Array

例子

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,
  array:      [],
  ofString:   [String],
  ofNumber:   [Number],
  ofDates:    [Date],
  ofBuffer:   [Buffer],
  ofBoolean:  [Boolean],
  ofMixed:    [Schema.Types.Mixed],
  ofObjectId: [Schema.Types.ObjectId],
  nested: {
    stuff: { type: String, lowercase: true, trim: true }
  }
})
// example use
var Thing = mongoose.model('Thing', schema);  
var m = new Thing;  
m.name = 'Statue of Liberty'  
m.age = 125;  
m.updated = new Date;  
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.ofDate.addToSet(new Date);  
m.ofBuffer.pop();  
m.ofMixed = [1, [], 'three', { four: 5 }];  
m.nested.stuff = 'good';  
m.save(callback);  

使用说明:

Dates

内置的 Date方法没有挂在mongoose的跟踪逻辑的变化上。意思就是如果你在document中用一个Date,用setMonth()这样的方法去修改它,mongoose不会知道这个变化,并且doc.save()不会存留这个修改。如果必须使用内置方法修改日期类型,在保存之前用doc.markModified('pathToYourDate')告诉mongoose的更改。

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
})

Mixed

一个“任何事物”SchemaType,它有较强的灵活性,同时也更难以维护。Mixed可以通过Schema.Types.Mixed或传递一个空对象字面量。以下是等效的:

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

由于它是一个无模式的类型,您可以将值更改为任何您喜欢的,但Mongoose失去自动检测和保存这些更改的能力。 要“告诉”Mongoose混合类型的值已更改,请调用文档的.markModified(路径)方法将路径传递到刚更改的混合类型。

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

ObjectIds

要指定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

Arrays

提供了SchemaTypes或Sub-Documents数组的创建。

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

注意:指定空数组等效于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: [{}] });  

创建自定义类型

Mongoose也可以扩展自定义SchemaTypes。
插件网站中搜索兼容类型(例如mongoose-long其他类型)。

licat

继续阅读此作者的更多文章