我有一个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
答案 0 :(得分:0)
result = db.vulnerabilities.delete_many({'已发布':last_month})
首先,字段名称区分大小写。在您的文档中,您有published
,但在您的查询中P
为Published
。
另请注意,您将文档中的日期存储为字符串类型,请尽可能使用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 Indexes和Tutorial: Expire Data from Collections by Setting TTL。