【问题标题】:Searching objects who's timestamp is greater than X days搜索时间戳大于 X 天的对象
【发布时间】:2016-12-22 20:19:42
【问题描述】:

这周我已经精疲力尽了!我无法修复一个应该用一些基础数学来解决的错误。

我的 mongodb 数据库中有一些“事件”对象,它们是使用日期字段创建的,在预保存挂钩中,我计算年份编号并将其放置到模型上。例如。

1 月 1 日 = 1

1 月 5 日 = 5

12 月 31 日 = 365

我的应用程序的用户可以搜索当前日期前 X 天的事件。我的查询类似于:

{
     day_number: { $gte: start_day, $lte: end_day}
}

现在年底到了,有一个逻辑错误。

假设输入是 12 月 22 日到 1 月 2 日

我的查询正在进行:

{
    day_number: { $gte: 356, $lte: 2}
}

这当然不会返回任何结果,因为没有数字大于或等于 356 且小于或等于 2。

有什么建议可以解决这个问题,不涉及破坏一个虽然破碎但简单的查询?

【问题讨论】:

  • 可能是day_number: { $gte: start_day, $lte: (end_day < start_day? 365 : 0) + 2}

标签: javascript mongodb date math


【解决方案1】:

您可以测试结束日期是否小于开始日期,然后像这样调整结束日期:

var start_day;
var end_day;
var numDaysInbetween = 0;
var day_number = {}

/* test 1 */
start_day = 50;
end_day = 55;

/* test 2 */
start_day = 356;
end_day = 2;

if (start_day > end_day) {
  end_day += 365;
}
day_number = { $gte: start_day, $lte: end_day };

alert(day_number.$lte - day_number.$gte);

【讨论】:

  • 这正是我现在写在纸上的内容 :)
  • 我将在今晚晚些时候回来并投票/接受答案:)
  • 谢谢!很高兴我能帮上忙。
【解决方案2】:

计算机系统中的大多数时间计算使用自相当任意的日期 1970-01-01 0:00 以来经过的毫秒数作为可排序的时间变量。

您可以应用相同的原则,但使用自 2016 年 1 月 1 日以来的天数,这将使 1 月 2 日 == 367 天。这样查询不需要更改,您的“钩子”只需要一个小模块。

【讨论】:

  • 有趣,让我处理一下然后回复你。我的大脑从这个月的太多小时开始今晚就昏昏欲睡了,我会拿出笔和纸,然后在适当的时候回来投票/接受。为您的意见干杯:)
猜你喜欢
  • 2011-09-30
  • 2018-07-11
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多