【问题标题】:How to convert a string date in mongodb to ISODate(), or DATE() and delete if it is less than 30 days using python?如何将mongodb中的字符串日期转换为ISODate()或DATE(),如果使用python少于30天则删除?
【发布时间】:2017-09-03 04:50:42
【问题描述】:

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

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

现在我想删除所有超过 30 天的条目。 我怎样才能实现这个逻辑?

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    你可以做的更简单。为了便于解释,这段代码比需要的要长得多。

    我首先创建了一个 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
    

    【讨论】:

    • 我有一个疑问:{'$lt':boundary} => 这个计算日期是否小于或“边界”中的数字之和小于?如果是后者,以后有没有失败的可能?
    • 我不清楚你的意思。我会尝试以这种方式回答,如果不是您想知道的,请再试一次。 boundary 的计算相对于 now 只计算一次。在此示例中,posts 包含数据库中的所有 个帖子。但是,{'completed_time': {'$lt': boundary}} 考虑一次发布一个。我的意思是,每个completed_time 要么小于(即“之前”)boundary,要么不是。如果任何给定的帖子小于boundary,那么它将被删除。也许你在想now 不固定的事实?
    【解决方案2】:

    您可以使用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!")
    

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 2017-12-08
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多