我的日期间隔类型的文档中有很多字段,例如
{
publishDate:
{
start: {type: Date, required: true},
end: {type: Date, required: true}
}
}
为了减少代码的重复并使其更易于维护,如何创建自定义Mongoose类型,例如 DateInterval ,包含两个字段:
并包含验证器,确保两个字段都填写完毕,并且开始是在结束之前?
答案 0 :(得分:3)
您可以在mongoose中重用模式。
var DateIntervalSchema = new Schema({
start: {type: Date, required: true},
end: {type: Date, required: true}
});
var SomeSchema = new Schema({
publishDate: [DateIntervalSchema],
// ... etc
});
您还可以参考其他馆藏的文件。
var SomeSchema = new Schema({
publishDate: {type: Schema.ObjectId, ref: 'DateInterval'}
});
//using populate
SomeModel.findOne({ someField: "value" })
.populate('publishDate') // <--
.exec(function (err, doc) {
if (err) ...
})
答案 1 :(得分:1)
您需要开发自定义架构类型。已经有很多插件可以执行此操作,其中一个插件可以在这里找到:https://github.com/aheckmann/mongoose-long/blob/master/lib/index.js。这是一个很好的基本示例。
出于您的目的,您可以创建DateInterval
自定义架构,将其转换为Date
类型,然后使用validator
检查start
和{{ 1}} - http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate。
答案 2 :(得分:0)
由于mongoose&gt; = 4.4,您可以实施custom schema type。
文档不是很清楚,但您可以follow this example。
你必须:
使用DateInterval
/ toBSON()
和toJSON()
原型方法定义您的toObject()
自定义对象
定义从DateIntervalType
继承的mongoose.SchemaType
,用于处理猫鼬集成,并转换为DateInterval
。
通过这种方式,您可以实现对内存( Mongoose model )和mongodb( raw的bson )数据表示的完全控制。