2017-09-02 1584 views

回答

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天前不是“现在”当我计算它,并把它的格式在你的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 
+0

我有一个疑问:{'$ lt':boundary} =>这是计算日期小于还是“边界”中的数字之和小于?如果后者是这种情况,将来有没有机会失败? –

+0

我不清楚你的意思。我会尝试以这种方式回答,如果这不是你想知道的,请再试一次。 “边界”的计算仅计算一次,相对于“现在”。在这个例子中'posts'包含数据库中所有*帖子。然而,'{'completed_time':{'$ lt':boundary}}'一次只考虑一个帖子*。我的意思是,每个“completed_time”或者小于(即'之前')“边界”,或者不是。如果任何给定的发布小于“边界”,则它将被删除。也许你正在考虑“现在”不是固定的事实? –

0

您可以使用datetime模块将日期/时间字符串转换为datetime对象,然后将其转换为序数日(仅为单个数字),并将其与30天前的日期进行比较。

希望这会做你想要什么:

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!") 
相关问题