【发布时间】:2017-09-03 04:50:42
【问题描述】:
我使用 python 将日期以以下格式保存到 MongoDB 中,
completed_time : "2017:08:20 02:30:02"
现在我想删除所有超过 30 天的条目。 我怎样才能实现这个逻辑?
【问题讨论】:
我使用 python 将日期以以下格式保存到 MongoDB 中,
completed_time : "2017:08:20 02:30:02"
现在我想删除所有超过 30 天的条目。 我怎样才能实现这个逻辑?
【问题讨论】:
你可以做的更简单。为了便于解释,这段代码比需要的要长得多。
我首先创建了一个 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 天的时间和日期,并将其以 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
【讨论】:
boundary 的计算相对于 now 只计算一次。在此示例中,posts 包含数据库中的所有 个帖子。但是,{'completed_time': {'$lt': boundary}} 考虑一次发布一个。我的意思是,每个completed_time 要么小于(即“之前”)boundary,要么不是。如果任何给定的帖子小于boundary,那么它将被删除。也许你在想now 不固定的事实?
您可以使用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!")
【讨论】: