mongoose4.5中文教程
  • Introduction
  • Mongoose
  • guide
    • 模式(schemas)
      • 模式类型(types)
      • 自定义类型(custom)
    • 模型(models)
    • 文档(documents)
      • 子文档(sub docs)
      • 默认值(defaults)
    • 查询(queries)
    • 验证(validation)
    • 中间件(middleware)
    • 联表(population)
    • 连接(connections)
    • 插件(plugins)
    • 承诺(promises)
    • 鉴频器(discriminators)
    • 贡献
    • ES2015 整合
    • 浏览器中的schemas
    • 自定义schema类型
    • MongoDB版本兼容性
    • 3.6 发布说明
    • 3.8 发布说明
    • 4.0 发布说明
  • API 文档
Powered by GitBook
On this page
  • SchemaTypes
  • 使用说明:
  • 创建自定义类型
  • 下一步

Was this helpful?

  1. guide
  2. 模式(schemas)

模式类型(types)

Previous模式(schemas)Next自定义类型(custom)

Last updated 6 years ago

Was this helpful?

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

SchemaTypes

SchemaTypes 为处理定义path , , , , ,以及为了和的其他一般特征。检查他们各自的的更多细节的 API 文档。

以下是所有有效的。

  • Boolean

  • Mixed

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

使用说明:

Dates

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

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

提供创建数组的或。

Mongoose也可以扩展自定义 SchemaTypes 。搜索兼容类型的站点,如,,以及。要创建您自己的自定义schema,请看一看。

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

SchemaTypes
查询
defaults
validation
getters
setters
field selection defaults
字符串
数值
Schema Types
String
Number
Date
Buffer
Objectid
内置的日期的方法
SchemaTypes
子文档
插件
mongoose-long
mongoose-int32
其他类型
创建基本的自定义schema类型
模型