Mongoose自定义模式类型日期间隔

时间:2014-06-30 13:31:27

标签: node.js mongodb mongoose mongoose-schema

我的日期间隔类型的文档中有很多字段,例如

{
    publishDate:
    {
       start: {type: Date, required: true},
       end: {type: Date, required: true}
    }
}

为了减少代码的重复并使其更易于维护,如何创建自定义Mongoose类型,例如 DateInterval ,包含两个字段:

  1. 开始
  2. 并包含验证器,确保两个字段都填写完毕,并且开始是在结束之前?

3 个答案:

答案 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)

由于&gt; = 4.4,您可以实施custom schema type

文档不是很清楚,但您可以follow this example

你必须:

  • 使用DateInterval / toBSON()toJSON()原型方法定义您的toObject()自定义对象

  • 定义从DateIntervalType继承的mongoose.SchemaType,用于处理猫鼬集成,并转换为DateInterval

通过这种方式,您可以实现对内存( Mongoose model )和mongodb( raw的bson )数据表示的完全控制。