【问题标题】:MongoDB mm/dd/yy based $gte & $le基于 MongoDB mm/dd/yy 的 $gte 和 $le
【发布时间】:2013-05-05 13:59:33
【问题描述】:

首先,请原谅我的英语。

现在,我面临的问题是,现有数据库在“startOn”对象中有一个名为“Date”的列。这意味着,它就像“startOn.Date”,它有像yyyy/dd/mm 这样的数据。假设,我有一个类似的记录:2013/06/05。问题是,我需要从2 days7 days 之后获取数据。这意味着$gte: +2 days$le: +7 days

我尝试了几种方法,例如

$gte: use("RFCtoClean")(new Date(year, month - 1, day + 2)),

RFCtoClean 是:

function RFCtoClean(d) {
d = new Date(d);
return d.getUTCFullYear() + "/" + pad(d.getUTCDate()) + "/" + pad(d.getUTCMonth() + 1);}

除了以下代码的回调返回undefined之外什么都没有返回。

var currentDate = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
                var day = currentDate.getDate()
                , month = currentDate.getMonth() + 1
                , year = currentDate.getFullYear();
Event.find({
                    author: user_id,
                    "startOn.Date": {
                        $gte: use("RFCtoClean")(new Date(year, month - 1, day + 2)),
                        $le: use("RFCtoClean")(new Date(year, month - 1, day + 7))
                    }
                }, '_id title location startOn attendees', {
                    limit: limit
                })
                .sort({_id: -1})
                .execFind(function(err, events) {
    // events variable is undefined here and empty err object,
    });

谁能帮我摆脱困境?

【问题讨论】:

  • 您是说文档包含日期作为字符串吗? “YYYY/MM/DD”?并且您想将其作为日期类型而不是字符串来操作?
  • 真的是“YYYY/DD/MM”而不是“YYYY/MM/DD”吗?如果它是 MM/DD,那么您实际上可以为此比较​​字符串,但如果它像您建议的那样是 DD/MM,您将不得不使用 $where 并转换为日期。如果该字段是字符串,mongo 会将其视为字符串,而不是日期,例如,字符串“2000/31/01”“大于”“2000/01/02”,因为日期先到字符串,即使月份更高,而“2000/01/31”将“小于”“2000/02/01”。
  • 如果日期采用这种完全奇怪且非标准的格式,那么真正的问题不是数据有效性吗? IE。没有任何东西以这种格式读取日期 - 所以任务不应该是修复整个集合以具有“正常”格式的日期并从现在开始清理它吗?
  • 我会等待确认 - d = new Date(d);意味着用这个字符串调用 Date 会返回一个有效的日期,这意味着它必须是“YYYY/MM/DD”所以也许它只是一个“错字”? OP将不得不回复。 @HamzaWaqas 你能确认一下字符串格式是什么吗?
  • 这个标题具有误导性。标题中所述的格式与问题中使用的格式不匹配。

标签: javascript node.js mongodb mongoose


【解决方案1】:

你得到一个字符串形式的日期,就像这样"2013/06/05" - 看起来你知道如何再得到两个字符串,它们是前两天或后七天,对吧?所以你将拥有:

from="2013/06/03;
till="2013/06/12;

现在只需进行常规查找:

db.data.find( {
               "startonDate" : {
                   $gte: from,
                   $lte: till
               } 
            } );

【讨论】:

  • 如果日期字符串的格式为“yyyy/mm/dd”,这起作用,但日期似乎(奇怪地)格式化为“yyyy/dd/mm”。如果情况确实如此,那么日将优先于月,这意味着简单的字符串比较将失败。
猜你喜欢
  • 2023-03-09
  • 2012-01-27
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多