(Python)按日期查询,日期以字符串形式存储在mongoDB集合中

时间:2019-03-26 20:33:28

标签: python-3.x datetime nested pymongo

当日期存储为字符串时,如何按日期查询db.collection?由于此数据库很大且还在不断增长,因此for循环来转换每个日期时间很长的时间没有意义。长期解决方案。

我正在创建一个管道以查询集合中的任何给定日期,但是我尝试的每个查询都会导致一个空列表[]。

日期格式: “ ts”:“ 2018-09-26T21:02:19 + 00:00”

我正在寻找一种解决方案,因为数据库正在增长,因此避免了在for循环中重新格式化datetime关键字,并且比运行非datetime查询,转换为pandas然后转换为datetime的时间要长一些(在脚本的下游)。

我从各种SO帖子中尝试了几次尝试,但都产生了空结果: 1.

n = db.collection.find({'ts':{'$lt':datetime.now(), '$gt':datetime.now() - timedelta(hours=10000)}})

print(n)
[]

2。:

start = datetime(2019, 2, 2, 6, 35, 6, 764)
end = datetime(2019, 2, 20, 6, 55, 3, 381)

doc = db.collection.find({'ts': {'$gte': start, '$lt': end}})
print(doc)
[]

但是我开始认为这是在ts键中格式化日期的方式。这是一个文档示例:

{
"_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"}

我在这里想念什么吗?这是格式问题吗?

1 个答案:

答案 0 :(得分:1)

您可以将字符串转换为日期时间,并进行如下比较:

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

正如我在您的数据中看到的那样,我认为您应该在文档的“ d”中进行循环,但是对于转换和比较日期,您可以这样做。

您可以将日期时间转换为字符串,并根据需要进行查找。这样做:

a = datetime.now()
now = a.strftime("%Y-%m-%dT%X+00:00")

现在您可以使用find方法。 用于数组查询:

 db.collection.find( { "d": { $elemMatch: {"ts" : {'$lt':end, '$gt':start } } } )