使用$ lte进行日期查询不起作用

时间:2016-01-15 03:37:58

标签: mongodb

我想使用2016-01-14中小于15:00的日期时间来查询数据,但它无效。

这是我的示例集合

{
    "_id" : ObjectId("5697528237b79c198c94ad1a"),
    "actionName" : "touchMove",
    "timeStamp" : ISODate("2016-01-14T14:47:13.596Z")
}
{
    "_id" : ObjectId("5697528237b79c198c94ad16"),
    "actionName" : "touchDown",
    "timeStamp" : ISODate("2016-01-14T14:47:13.597Z")
}
{
    "_id" : ObjectId("5697528237b79c198c94ad1e"),
    "actionName" : "touchMove",
    "timeStamp" : ISODate("2016-01-14T16:01:49.620Z")
}
{
    "_id" : ObjectId("5697528237b79c198c94ad1b"),
    "actionName" : "touchDown",
    "timeStamp" : ISODate("2016-01-14T16:01:50.010Z")
}
{
    "_id" : ObjectId("5697528237b79c198c94ad17"),
    "actionName" : "touchMove",
    "timeStamp" : ISODate("2016-01-14T16:01:49.630Z")
}

这是我的查询代码

db.getCollection('app1_touchpoint').find({
 'timeStamp' : {'$lte':new Date(2016, 01, 14, 15, 00)}
})

当我查询时,具有' timeStamp'超过2016-01-14 15:00也显示在结果中。实际上显示了所有数据。 是否有人能够就如何以正确的方式进行此查询给我一些建议?谢谢。

1 个答案:

答案 0 :(得分:0)

您在查询中添加的日期默认为c#中的本地日期。但是 - mongo中的日期默认为utc。

你有几个选择。

  1. 移动到位于utc行另一侧的位置。这将解决您的lte问题,但可能会为gte带来问题。

  2. 使用DateTimeKind.Utc 并在使用它进行查询之前将该日期类型设置为utc。

  3. 例如

    如果我打算用你的样本数据来做,我会这样做:

    var dt = DateTime.SpecifyKind(new Date(2016, 01, 14, 15, 0, 0), DateTimeKind.Unspecified);
    db.getCollection('app1_touchpoint').find({
     'timeStamp' : {'$lte':dt}
    });
    

    我假设我们的目标是在数据库中查询日期(而不是在将这些日期转换为您的时区后查询它们)。这将实现这一目标。