Python 3.x (Python)按mongoDB集合中存储为字符串的日期进行查询
当日期存储为字符串时,如何按日期查询db.collection?由于此数据库庞大且不断增长,因此,对于长期解决方案来说,转换每个日期时间的for循环没有意义 我正在创建一个管道来查询任何给定日期的集合,但我尝试的每个查询都会导致一个空列表[] 日期格式:“ts”:“2018-09-26T21:02:19+00:00” 我正在寻找一种解决方案,它可以避免在for循环中重新配置datetime键,因为数据库正在增长,这比在脚本的下游运行非datetime查询、转换为pandas然后转换为datetime需要更长的时间 我从各种SO帖子中尝试了几次,结果都是空的: 1. 2.: 然而,我开始认为这就是我的日期在ts键中的格式。以下是一个文档示例:Python 3.x (Python)按mongoDB集合中存储为字符串的日期进行查询,python-3.x,datetime,nested,pymongo,Python 3.x,Datetime,Nested,Pymongo,当日期存储为字符串时,如何按日期查询db.collection?由于此数据库庞大且不断增长,因此,对于长期解决方案来说,转换每个日期时间的for循环没有意义 我正在创建一个管道来查询任何给定日期的集合,但我尝试的每个查询都会导致一个空列表[] 日期格式:“ts”:“2018-09-26T21:02:19+00:00” 我正在寻找一种解决方案,它可以避免在for循环中重新配置datetime键,因为数据库正在增长,这比在脚本的下游运行非datetime查询、转换为pandas然后转换为dateti
{
"_id": {
"$oid": "5babf3dab512dd0165efd36c"
},
"d": [
{
"d": [
17317,
16556,
9680,
55982,
45948
],
"h": 74.65,
"ts": "2018-09-26T21:02:19+00:00",
"p": [
61,
76,
137,
152,
122
],
"si": "9829563c95d0155f",
"t": 24.82,
"ti": "0000000000000000"
},
{
"d": [
17821,
17488,
9199,
56447,
44089
],
"h": 80.09,
"ts": "2018-09-26T21:02:19+00:00",
"p": [
61,
76,
137,
152,
122
],
"si": "a42fbc88a44a316f",
"t": 25.1,
"ti": "0000000000000000"
}
],
"gi": "GW-P1007"}
我是不是遗漏了什么?这是一个格式问题吗?您可以将字符串转换为日期时间,并按如下方式进行比较:
from datetime import datetime
from datetime import timedelta
q = list(db.collection.find())
result = []
for i in q:
for j in i["d"]:
time = datetime.strptime(j["ts"], "%Y-%m-%dT%X+00:00")
end = datetime.now()
start = end - timedelta(hours=10000)
if time >= start and time <= end:
result.append(i) #or append all document
现在您可以使用find方法。
对于数组中的查询:
db.collection.find( { "d": { $elemMatch: {"ts" : {'$lt':end, '$gt':start } } } )
你好,阿里,谢谢你的回复。因此,在for循环中转换集合中的所有内容所需的时间远远超过仅通过另一个键对数据进行子集设置->然后格式化为dataframe->转换为datetime然后以这种方式进行子集设置所需的时间。我现在就这么做,而且不是一个长期的解决方案,因为数据库正在增长。是否可以按当前ts格式中的日期对集合进行子集划分?我将编辑OP以提供更多上下文。谢谢。我把这篇文章编辑成了一篇关于解决方案的文章,它不涉及将所有内容转换为datetime。此方法可以工作,但对于我正在查找的内容来说太慢。您可以像上面那样将datetime转换为字符串。我认为它会工作得更快。它会给出一个“KeyError:'ts'”。你能详细说明一下文档中“d”中的循环吗?嘿-现在收到一个“keyrerror:'d'”-知道为什么吗?
from datetime import datetime
from datetime import timedelta
q = list(db.collection.find())
result = []
for i in q:
for j in i["d"]:
time = datetime.strptime(j["ts"], "%Y-%m-%dT%X+00:00")
end = datetime.now()
start = end - timedelta(hours=10000)
if time >= start and time <= end:
result.append(i) #or append all document
a = datetime.now()
now = a.strftime("%Y-%m-%dT%X+00:00")
db.collection.find( { "d": { $elemMatch: {"ts" : {'$lt':end, '$gt':start } } } )