Pymongo在某个日期之后删除文件

时间:2017-11-24 14:57:45

标签: python mongodb

我有一个python脚本,我希望在undefined关键日期超过30天时删除一些MongoDB文档。

我的代码目前是:

false

此代码运行时没有错误,但不删除任何文档,我相信这是因为published键中的日期具有Unix格式的日期,即def db_rotate(mongo_server, mongo_port): try: logging.info('Connecting to MongoDB') client = MongoClient(mongo_server, mongo_port) db = client['vuln_sets'] logging.info('Connected to MongoDB') today = datetime.now() last_month = today - timedelta(days=30) result = db.vulnerabilities.delete_many({'Published': last_month}) logging.info('Deleted ' + str(result.deleted_count) + ' vulnerabilities') except Exception as e: logging.exception(e) ,而last_month变量使用不同的格式。

插入文档的代码是:

Published

插入文件的一个例子是:

2017-10-30T11:36:20

1 个答案:

答案 0 :(得分:0)

  

result = db.vulnerabilities.delete_many({'已发布':last_month})

首先,字段名称区分大小写。在您的文档中,您有published,但在您的查询中PPublished

另请注意,您将文档中的日期存储为字符串类型,请尽可能使用Python datetime object。有关更多信息和示例,另请参阅PyMongo Datetimes and Timezones。即

last_month = datetime.now() - timedelta(days=30) 

传递到删除查询时last_month的值为datetime.datetime(2017, 10, 28, 17, 36, 34, 358732)。如果要将其转换为String,则为2017-10-28 17:36:34.358732。正如您所看到的,这两个值都不是您所期望的。

将值存储为Date object的另一个好处是,您可以对30天内通过的任何日期使用表达式,即{published: {$gt: <30 days ago>}}

另见datetime.strptime to convert string to datetime例如:

datetime.datetime.strptime(string_date, "%Y-%m-%d %H:%M:%S.%f")

如上所述,如果您打算在MongoDB中过期某个时间戳的文档,请参阅MongoDB TTL IndexesTutorial: Expire Data from Collections by Setting TTL