添加大写:真正的mongooseembedded文件

如果我有两个模式,一个embedded另一个:

var mongoose = require("mongoose"); var Schema = mongoose.Schema; // Will embed this in the personSchema below var addressSchema = new Schema({ street: String, city: String, state: { type: String, uppercase: true }, zip: Number }); var personSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, emailAddress: { type: String, lowercase: true }, phoneNumber: Number, address: addressSchema }); module.exports = mongoose.model("Person", personSchema); 

我似乎无法得到uppercase: true的工作embedded式文件 – 没有错误被抛出,但它不会大写状态属性。 或者任何类似的选项。

我一直在searchMongoose文档,但也许我只是没有find它提到的设置这些types的附加选项子文档将无法正常工作。

不是积极的,如果这是最好的办法做到这一点,但我添加了一个预保存钩子(根据评论@nbro的build议),似乎工作:

 var addressSchema = new Schema({ street: String, city: String, state: { type: String, uppercase: true }, zip: Number }); addressSchema.pre("save", function (next) { this.state = this.state.toUpperCase(); next(); }); var personSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, emailAddress: { type: String, lowercase: true }, phoneNumber: Number, address: addressSchema }); 

更新#1:

我似乎能够find大量embedded简单模式的人的情况,而无需进行任何额外的validation( required: true )或更改( uppercase: true )。 虽然上面的解决scheme确实有效,但似乎没有必要。 我应该做的只是把对象文字embedded信息:

 var personSchema = new Schema({ ... address: { street: String, city: String, state: { type: String, uppercase: true }, zip: Number } }); 

看起来像使用独立模式的唯一好理由是,如果您绝对需要embedded数据具有_id属性, 并且您不需要为任何属性添加其他validation或更改选项。 如果你需要一个_id ,我猜你可能不应该embedded数据,而是把它作为一个单独的对象保存并做参考。

随着我发现新的信息和最佳实践,我将不断更新。

更新#2:

如果您想要对embedded式文档进行validation(例如制作所需的address属性),则必须单独执行此操作,正如这篇非常好的博客文章中所述 。

直到最近,如果你试图直接在另一个模式中embedded一个模式,Mongoose会抛出exception。 它看起来像现在部分支持,但显然不是这样的情况。

你可以通过使用addressSchema的定义对象而不是addressSchemaaddress字段定义中的模式本身来personSchema

 var addressObject = { street: String, city: String, state: { type: String, uppercase: true }, zip: Number }; var addressSchema = new Schema(addressObject); var personSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, emailAddress: { type: String, lowercase: true }, phoneNumber: Number, address: addressObject });