【问题标题】:Meteor + MongoDB : Check if date is in rangeMeteor + MongoDB:检查日期是否在范围内
【发布时间】:2016-01-25 19:47:49
【问题描述】:

我在显示来自 MongoDB 的记录时遇到了困难。基本上,我的 MongoDB 中有一些字段“leaves_start”和“leaves_end”。此字段包含用户休假的日期范围。请参见下面的示例。

用户名:junel

leaves_start:10/05/2015

leaves_end:2015 年 10 月 10 日

如果当前日期(例如 10/07/2015)在记录的离开开始和离开结束的范围内,我想获取 MongoDB 中的所有记录。

我已经尝试过 $gte 和 $lte,但我对如何在当前状态下实现它有点困惑。

这是我的示例方法:

getTowerLeaveData_LV: function(dateToday,tower) {
    var arr = LeavesCollection.find($or: [ 
        { leaves_start: { $lte: dateToday } }, 
        { leaves_end: { $gte: dateToday } } ], 
        leaves_approval_status: {$ne: 'Rejected'}}).fetch();

        return arr
},

这是我的示例 Mongodb 记录

_____________________________________
name   |  leaves_start   | leaves_end
_____________________________________
Junel  | 10/01/2015      | 10/03/2015
_____________________________________
Jaycee | 10/03/2015      | 10/03/2015
_____________________________________
Tori   | 10/05/2015      | 10/10/2015
_____________________________________
Ryan   | 10/02/2015      | 10/05/2015

如果 dateToday 的值为 10/03/2015,则方法应返回 Junel、Jaycee 和 Ryan 的记录。

我希望这是有道理的。多谢你们!

【问题讨论】:

  • 您能否单击edit 链接以包含架构详细信息、一些具有预期输出的示例数据?
  • 嗨 chidram,更新完毕。谢谢!
  • 感谢更新,能否说明leaves_startleaves_end 字段是保存字符串还是日期对象?
  • 字段包含字符串。
  • 您好,chridam,感谢您的建议。尽管我没有使用 $gte 和 $lte,但我已经成功找到了解决问题的方法。

标签: javascript mongodb meteor


【解决方案1】:

我不确定这是否会有所帮助,但这是我想出的代码:

记录

方法:

//monthyear = "10-2015"
//numOfDays = 31

getTowerLeaveData_LV: function(monthyear, numOfDays,tower, userid, username) {
        var selectedMonthYear = monthyear.split("-");
        var tempArr = new Array();
        var reArr = new Array()

        tempArr.push(username)
        reArr.push(username);

        LeavesCollection.find({associate_tower: {$in: tower}, leaves_approval_status: {$ne: 'Rejected'}, user_id: userid},{sort:{leaves_timestamp   :-1}},{fields: {_id:1,user_id:1,associate_id:1, associate_fullname:1,leaves_type:1,leaves_start:1,leaves_end:1, leaves_days:1}}).forEach(
          function(leaver) {
              for(var a=1; a!=numOfDays+1; a++) {
                var dateActive = selectedMonthYear[0] + "/" + a.toString() + "/" + selectedMonthYear[1];
                var res = dateCheck(leaver.leaves_start, leaver.leaves_end,dateActive);
                if(res == true) {
                    tempArr.splice(a, 0,[leaver.leaves_approval_status,leaver.leaves_type,leaver._id,leaver.associate_fullname,a]);
                }
              }
          });

        for(var a=1; a!=numOfDays+1; a++) {
          var temp = findKey(tempArr,a);

          if(temp != false) {
            reArr.push(tempArr[temp]);
          } else {
            reArr.push('null')
          }
        }

        return reArr;

    },

其他 JS 函数:

function dateCheck(from,to,check) {

    var fDate,lDate,cDate;
    fDate = Date.parse(from);
    lDate = Date.parse(to);
    cDate = Date.parse(check);

    if((cDate <= lDate && cDate >= fDate)) {
        return true;
    }
    return false;
}



function findKey(array, search) {
  var theIndex = false;
  for (var i = 0; i < array.length; i++) {
    if (array[i].indexOf(search) > -1) {
        theIndex = i;
        break;
    }
  }
  return(theIndex);
}

数组中的输出:

输出说明:

数组中Name后面的项等于numOfDays(即日期)的值。如果程序在“leaves_start”和“leaves_end”之间找到匹配日期,它将从mongodb返回数组数据,如果没有,它将返回“null”。

【讨论】:

    【解决方案2】:
    startDate =  ;// get Start Date from UI Convert it to date format using new Date();
    endDate   =  ;// get End Date from UI Convert it to date format using new Date();
    MyCollection.find({
      leaves_start: { $lte: endDate},   // start Less and endDate
      leaves_end:   { $gte: startDate } // end greater than StartDate
    });
    

    如果 startDate 和 endDate 相同,您将获得该日期的所有记录,否则它将是日期范围。

    【讨论】:

      【解决方案3】:

      你会这样做

      MyCollection.find({
        leaves_start: { $lte: new Date },
        leaves_end:   { $gte: new Date }
      });
      

      【讨论】:

      • 这是基于假设 leaves_startleaves_end 字段的值是有效的 Date 对象,而不是字符串,OP 尚未澄清这一点。
      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      相关资源
      最近更新 更多