如何使用python将mongodb中的字符串日期转换为ISODate()或DATE()并删除它是否少于30天?

时间:2017-09-02 06:28:16

标签: python mongodb pymongo

使用python我以下面的格式将日期保存到MongoDB中,

completed_time : "2017:08:20 02:30:02"

现在我要删除所有超过30天的条目。 我该如何实现这个逻辑?

2 个答案:

答案 0 :(得分:0)

您可以使用datetime模块将日期/时间字符串转换为datetime对象,然后将其转换为序数日(只需一个数字),并将其与当天进行比较那是三十天前的事。

希望这会做你想要的:

import datetime

completed_time = "2017:07:20 02:30:02"

timeFormat = '%Y:%m:%d %H:%M:%S'
thisDate = datetime.datetime.strptime(completed_time, timeFormat).toordinal()

today = datetime.date.today()
thirtyDaysAgo = today.toordinal() - 30

if thisDate < thirtyDaysAgo:
    print("That needs deleting!")

答案 1 :(得分:0)

你可以更简单地做到这一点。此代码比需要的时间长得多,以便解释。

我首先创建一个MongoDB记录集合,其日期大约从一个半月前开始,大约两周前结束。

>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> db = client.test_database
>>> from datetime import datetime, timedelta
>>> some_dates = [datetime(2017, 7, d).strftime('%Y:%m:%d %H:%M:%S') for d in range(15,31)]+[datetime(2017, 8, d).strftime('%Y:%m:%d %H:%M:%S') for d in range(1,16)]
>>> posts = db.create_collection
>>> for some_date in some_dates:
...     post = {'completed_time': some_date, 'stuff': 'more stuff'}
...     post_id = posts.insert_one(post).inserted_id
... 

这会计算比现在提前30天(或更早)的时间和日期&#39;当我计算它,并将它放在MongoDB数据库中的格式。

>>> boundary = (datetime.now()-timedelta(30)).strftime('%Y:%m:%d %H:%M:%S')

这将计算数据库中记录的数量,其中的日期和时间位于刚刚计算的boundary中的值之前,供以后参考。

>>> count = 0
>>> for post in posts.find({'completed_time': {'$lt': boundary}}):
...     count+=1
... 
>>> count
19

这是一个行,通过boundary的计算,可以满足您的需求。

>>> r = posts.delete_many({'completed_time': {'$lt': boundary}})

现在我们可以检查是否删除了正确的记录数。

>>> count = 0
>>> for post in posts.find({'completed_time': {'$lt': boundary}}):
...     count+=1
... 
>>> count
0