【问题标题】:Mongoose custom schema type date intervalMongoose 自定义模式类型日期间隔
【发布时间】:2014-08-20 21:27:28
【问题描述】:

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

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

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

  1. 开始
  2. 结束

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

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    您可以在 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) ...
    
       })
    

    【讨论】:

    • 第一个例子不是声明了一个数组 DateIntervals,这意味着文档中可能还有0、2或很多间隔?
    【解决方案2】:

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

    那么,为了您的目的,您可以创建一个DateInterval 自定义架构,将其转换为Date 类型,然后使用validator 来检查startend - http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate

    【讨论】:

    • 这看起来很有趣,但是到目前为止我看到的所有自定义模式类型示例都只有一个值,而我有两个:startend。没有立即看到如何修改 mongoose-long 示例以支持两个字段以及如何在使用模型时设置这两个字段(例如 event.publishDate.start 和 event.publishDate.end)。有什么意见吗,@glortho?
    【解决方案3】:

    由于 >=4.4,您可以实现您的custom schema type

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

    你必须:

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

    • 定义继承自 mongoose.SchemaTypeDateIntervalType 用于处理 mongoose 集成,并转换为 DateInterval

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

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 2016-10-31
      • 1970-01-01
      • 2017-04-30
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多