MongoDB:日期范围查询应该返回任何内容

时间:2014-08-31 05:27:19

标签: mongodb meteor

我正在使用Meteor创建约会应用。我需要返回所选日期的约会。

这是我的数据结构

{ "lastname" : "adsads", "firstname" : "adsadsads", "time" : "12:00 PM", "notes" : "adsadsads", "length" : 15, "date" : ISODate("2014-08-31T00:00:00Z"), "createdAt" : ISODate("2014-08-31T04:02:12.367Z"), "_id" : "gTxgn5ysRBYCros9z" } 

查询代码:

console.log("Starting query build.")
var theDate = Session.get("date");
console.log(theDate);
startDate = moment(theDate).zone(-12).startOf("day")._d;
console.log(startDate);
endDate = moment(theDate).zone(-12).endOf("day")._d;
console.log(endDate);
queryPointer = appointmentList.find({date: {$gte: startDate, $lt: endDate}})
console.log(queryPointer.fetch());

我使用._d从中提取内部Date对象。 getDate()在返回之前将Date转换为UTC。我知道这是不好的做法,在当地时间存储日期,但我这样做是为了让这个该死的东西起作用。如果我能找到根本原因,我将切换回UTC。

字符串化查询:

"{"date":{"$gte":"2014-08-31T00:00:00.000Z","$lt":"2014-08-31T23:59:59.999Z"}}"

控制台输出:

"Starting query build." appointmentViewer.js:13
Date 2014-08-31T01:00:00.000Z appointmentViewer.js:15
Date 2014-08-31T00:00:00.000Z appointmentViewer.js:17
Date 2014-08-31T23:59:59.999Z appointmentViewer.js:19
Array [  ]

提前感谢您的任何帮助!

3 个答案:

答案 0 :(得分:0)

这就是我将日期存储为字符串的原因,尤其是在没有时间数据的情况下。见this answer。您似乎没有从Date()类型中获得任何好处,并且它会让您感到痛苦。字符串没什么问题。

只需使用.find({date: '2014-08-31'})即可完成。

答案 1 :(得分:0)

这是我之前遇到的同样问题的解决方案。

来自日期选择器:

    $('#start-datepicker').datepicker({
    format: "yyyy-mm-dd",
    autoclose:true
  });

    $('#end-datepicker').datepicker({
    format: "yyyy-mm-dd",
    autoclose:true
  });

这是棘手的部分。定义从日期+时间00:00:00到23:59:59

的日期
var xdate1 = t.find('.startDate').value;
var xdate2 = t.find('.endDate').value + " 23:59:59";
var date1 = moment(xdate1).format("YYYY-MM-DDTHH:mm:ssZ");
var date2 = moment(xdate2).format("YYYY-MM-DDTHH:mm:ssZ");

date1 = new Date(date1);
date2 = new Date(date2);

Session.set("giftsStartDate", date1);
Session.set("giftsEndDate", date2);

答案 2 :(得分:0)

唉,我很抱歉,我刚刚解决了这个问题,忘记回答了!

问题在于我对Meteor中的集合如何工作缺乏了解。我在页面加载时立即进行查询,这意味着服务器订阅没有发送数据来填充客户端minimongo dbs。解决方案是抛弃单击查询并将查询移动到反应计算 - 在我的例子中是模板助手,其中显示数据的模板将在数据填充本地数据库时自动更新。

最后我搬到了铁路由器,并使用它的waitOn功能只在数据到达时显示我的模板。