2

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

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

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

  1. 开始
  2. 结尾

并包含确保两个字段都填写的验证器,并且开始在结束之前?

4

3 回答 3

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) ...

   })
于 2014-06-30T13:44:12.130 回答
1

您需要开发自定义模式类型。已经有许多插件可以做到这一点,其中一个,对于长数字,可以在这里找到:https ://github.com/aheckmann/mongoose-long/blob/master/lib/index.js 。这是一个很好的基本示例。

然后,出于您的目的,您可以创建一个DateInterval自定义模式,将其转换为 type Date,然后使用 avalidator来检查startend- http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate

于 2014-06-30T13:43:26.397 回答
0

由于 >=4.4,您可以实现自定义模式类型

文档不是很清楚,但是你可以按照这个例子

你必须:

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

  • 定义DateIntervalType继承自mongoose.SchemaTypefor 处理mongoose集成,并转换为DateInterval.

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

于 2016-08-01T12:44:29.950 回答