Pymongo日期范围(具有不同时间的相同日期)查询不返回任何结果

时间:2017-11-20 11:06:00

标签: python mongodb pymongo

我是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"
 }

提前致谢!!

1 个答案:

答案 0 :(得分: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 }})