【问题标题】:Mongoose date comparison猫鼬日期比较
【发布时间】:2016-10-01 00:03:10
【问题描述】:

我的应用程序将允许用户创建优惠券。

优惠券在datefromdateto期间有效。

问题是每张优惠券都应该在选定的日子里有效,而不是几个小时。

例如从星期一(2016-06-12)到星期二(2016-06-13),所以两天。

我应该如何在服务器端存储日期,然后在 Mongoose 中使用 $gte 子句进行比较?

谢谢你:-)

【问题讨论】:

  • 您好,您找到解决方案了吗?

标签: node.js mongodb


【解决方案1】:
{ "_id" : 1, "couponStartDate" : ISODate("2016-06-26T18:57:30.012Z") }
{ "_id" : 2, "couponStartDate" : ISODate("2016-06-26T18:57:35.012Z") }


var startDate = new Date(); // I am assuming this is gonna be provided 
var validDate = startDate;
var parametricDayCount = 2;
validDate.setDate(validDate.getDate()+parametricDayCount);
CouponModel.find({couponStartDate: {$gte: startDate, $lte: validDate}}, function (err, docs) { ... });

【讨论】:

    【解决方案2】:

    如果你想在优惠券被持久化之前validate,你可以为日期字段创建一个max / min值:

    请看官方mongoose documentation on DATE validation的这个示例:

    var s = new Schema({ dateto: { type: Date, max: Date('2014-01-01') })
    var M = db.model('M', s)
    var m = new M({ dateto: Date('2014-12-08') })
    m.save(function (err) {
      console.error(err) // validator error
      m.dateto = Date('2013-12-31');
      m.save() // success
    })
    

    提示:使用snake_casecamelCase 作为字段名称

    【讨论】:

      【解决方案3】:

      您可以将过期时间存储为 UNIX 时间戳。在您的 Mongoose 模型中,您可以使用 expiration : { type: Number, required: true}

      如果您有用于创建优惠券的用户界面,那么您可以将日期选择器配置为以 UNIX 时间戳发送时间。

      或者如果你得到日期字符串,那么你可以使用var timestamp = new Date('Your_Date_String');

      对于天数的计算,您可以使用Moment JS。使用它,您可以使用.startOf(); 计算日期的开始,使用.endOf(); 计算日期的结束

      Moment JS 的时间戳返回可用于 $gte : some_timestamp$lte : some_timestamp 等 Mongoose 查询

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-25
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 2018-07-05
        • 2013-05-15
        • 1970-01-01
        相关资源
        最近更新 更多