模式类型(types)

原文:SchemaTypes 翻译:小虾米(QQ:509129)

SchemaTypes

SchemaTypes 为查询处理定义path defaults, validation, getters, setters, field selection defaults ,以及为了字符串数值的其他一般特征。检查他们各自的的更多细节的 API 文档。

以下是所有有效的Schema Types

例子

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.ofDates.addToSet(new Date);
m.ofBuffer.pop();
m.ofMixed = [1, [], 'three', { four: 5 }];
m.nested.stuff = 'good';
m.save(callback);

使用说明:

Dates

内置的日期的方法在mongoose用英语改变跟踪逻辑不是钩子,意味着如果您在文档中使用日期,并用类似的方法进行修改如setmonth(),mongoose不知道这种变化,并且doc.save()不会坚持这样的修改。如果你必须使用内置的方法修改日期类型,保存之前告诉mongoose关于doc.markModified('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
})

Mixed

一个“什么都行”的SchemaType,它的灵活性会带来权衡它难维护。混合类型可通过schema.types.mixed或通过传递一个空的对象。以下是等价的:

var Any = new Schema({ any: {} });
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

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子文档

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

注:指定一个空数组是相当于混合类型(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-longmongoose-int32以及其他类型。要创建您自己的自定义schema,请看一看创建基本的自定义schema类型

下一步

既然我们已经掌握了SchemaTypes,让我们看一看模型

Last updated