【问题标题】:Pymongo date range(same date with different time) query returns no resultsPymongo 日期范围(同一日期不同时间)查询不返回结果
【发布时间】:2017-11-20 11:06:00
【问题描述】:

我是 pymongo 的新手,我想在给定的 datetime 对象之间获取数据。我给出了具有不同时间的相同日期,这意味着如果我给出不同的日期意味着显示结果,它不会返回任何结果。我不知道为什么?所以,请任何人帮助我。我正在使用 MongoDB Compass,这里 ISODate 在 MongoDB Compass 中不可用,只有 Date 对象所以,我不希望 ISODate.Anyone 指导我。

这是我的代码:

    start = datetime.datetime(2017,11,17,10,00,23)
    end = datetime.datetime(2017,11,17,14,00,56)
    data = db.datapoints.find({'res_date':{'$gte':start,'$lte':end }})

这样的Mongo文档:

{
  _id:5a0c06aacff7580001e10fc9
  res_value:"1"
  line_code:"1"
  res_date:2017-11-17 10:36:40.564
  res_code:"1"
}
{
    _id:5a0e6fcc409d8f00017f477c
    res_value:"23"
    line_code:"22"
    res_date:2017-11-17 10:42:44.145
    res_code:"22"
 }
 {
    _id:5a0e6fcc409d8f00017f477c
    res_value:"243"
    line_code:"224"
    res_date:2017-11-17 12:07:07.496
    res_code:"223"
 }
 {
    _id:5a0e6fcc409d8f00017f477c
    res_value:"253"
    line_code:"225"
    res_date:2017-11-17 12:23:32.936
    res_code:"522"
 }

提前致谢!!

【问题讨论】:

  • 你的 res_date 的类型是什么?它是 ISODate() 吗?因为它看起来不像
  • 没有。它只是日期
  • 你能解决我的问题吗
  • 你试过直接在你的mongo数据库中查询日期范围吗?
  • 是的......但是如果比较相同的日期和不同的时间(我想获得最近三个小时的记录),它会为空结果集

标签: python mongodb pymongo


【解决方案1】:

如果您没有添加特定的偏移量,mongodb 将始终以 UTC 存储日期。

我试图用你提供的输入数据来跟踪低谷。这就是我添加的数据(与您的相同):

{ 
    "_id" : ObjectId("5a0c06aacff7580001e10fc9"), 
    "res_value" : "1", 
    "line_code" : "1", 
    "res_date" : ISODate("2017-11-17T10:36:40.564+0000"), 
    "res_code" : "1"
}
{ 
    "_id" : ObjectId("5a0e6fcc409d8f00017f477c"), 
    "res_value" : "23", 
    "line_code" : "22", 
    "res_date" : ISODate("2017-11-17T10:42:44.145+0000"), 
    "res_code" : "22"
}
{ 
    "_id" : ObjectId("5a1427c36c9b762bd4961f30"), 
    "res_value" : "243", 
    "line_code" : "224", 
    "res_date" : ISODate("2017-11-17T12:07:07.496+0000"), 
    "res_code" : "223"
}
{ 
    "_id" : ObjectId("5a1427d46c9b762bd4961f35"), 
    "res_value" : "253", 
    "line_code" : "225", 
    "res_date" : ISODate("2017-11-17T12:23:32.936+0000"), 
    "res_code" : "522"
}

有了这些数据和这个查询:

db.collectionName.find(
{
  'res_date':{'$gte': ISODate("2017-11-17T10:00:23.564+0000"),
              '$lte': ISODate("2017-11-17T14:00:56.564+0000") }
})

我得到所有 4 个结果。

我认为问题不在于您的 mongodb,而在于您的代码本身。看看这个博客https://julien.danjou.info/blog/2015/python-and-timezones

始终使用可感知的日期时间对象,即带有时区信息。那 确保您可以直接比较它们(知道和不知道日期时间 对象不可比较)并将它们正确返回给用户。 利用 pytz 拥有时区对象。

还要注意我添加的链接:

如果您需要存储这些时间戳,则应适用相同的规则。如果 您依赖 MongoDB,它假定所有时间戳都是 UTC,所以 存储它们时要小心——你必须标准化 UTC 时间戳。

尝试使用这两个用例进行查询。这是一个例子

import datetime
import pytz

startUnaware= datetime.datetime(2017, 11, 17, 10, 00, 23)
endUnaware= datetime.datetime(2017, 11, 17, 14, 00, 56)
dataUnaware = db.datapoints.find({'res_date':{'$gte':startUnaware,'$lte':endUnaware }})

startAware = datetime.datetime(2017, 11, 17, 10, 00, 23, pytz.UTC)
endAware = datetime.datetime(2017, 11, 17, 14, 00, 56, pytz.UTC)
dataAware = db.datapoints.find({'res_date':{'$gte':startAware,'$lte':endAware }})

【讨论】:

  • 我的数据库中有这么多文档...例如,我只显示我的文档格式。在我的代码中,我将静态日期放在该日期范围之间。但是,结果为空
  • 哦,好吧,只是以为您添加了您期望的文档作为示例结果
  • 两个查询都不起作用。第一个查询照常给出空结果,第二个查询给出导入错误。我导入 pytz 但显示“无法导入模块”错误。
  • 这个问题离题了。有关于如何安装 pytz 的解决方案,如果您找不到任何解决方案,请针对此主题提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 2020-08-16
  • 2019-10-19
  • 2019-07-14
  • 2020-03-21
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多