MongoDBタイミングデータ削除
MongoDBタイミングデータ削除
mongo範囲データの削除
mongo
1つの範囲のデータを削除するのはちょっと面倒で、直接remove
の方法を使うことができなくて、先に条件を満たすドキュメントを調べてから、1つずつ削除するしかありません.範囲、特に時間範囲のデータを削除する必要がある場合は、次の2つの解決策があります.mongo TTL(Time To Live)
を使用する.crontab
個のタイミングタスクを書き、タイミング接続mongo
は削除条件を満たすデータを照会し、項目ごとに削除する.TTL
TTL Indexes Expire Data from Collections by Setting TTL
expireAfterSeconds: xx
date
タイプのフィールドが必要です.If the indexed field in a document is not a date or an array that holds a date value(s), the document will not expire.
date
フィールドを使用してインデックスを作成します.// (lastModifiedDate.addHours(1))
db.log_events.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
// 2018-01-22 15:00:00
db.log_events.insert( {
"lastModifiedDate": new Date('Jan 22, 2018 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
mongo
はデータが期限切れに必ず削除されることを保証していない.一定の遅延があるかもしれない.削除メカニズムはmongo
がバックグラウンドで専門的にプロセスを起こし、60 sおきに削除する必要があるデータがあるかどうかを検査し、ある場合は削除し、期限切れがちょうど2回の検査の間にある場合は、削除は必ず遅延する.このメカニズムに基づいて、mongo
の性能に一定の影響を及ぼすと感じられる.expireAfterSeconds: 0
使用条件と秒数が0より大きい場合は一致し、削除メカニズムも同じで、フィールドの意味が異なります.
// (expireAt)
db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0} )
// 2018-01-22 14:00:00
db.log_events.insert( {
"expireAt": new Date('Jan 22, 2018 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
crontab
以上の2つの方法はいずれも1つの時間フィールドがあることに基づいているが、
mongo
の時間はUTC
時間であり、本物のlocal time
を得るにはtimeZoneOffset
1を減算する必要があり、この煩雑なプロセスを取り除くためにtime mills(long)
を直接時間フィールドとして使用するため、TTL
で削除することはできないため、自分でスクリプトを書く方式を採用し、毎日定時にデータを削除する.#!/bash/bin
# 30
MIN_DATE_NANO=`date -d \`date -d '30 days ago' +%Y%m%d\` +%s%N`;
MIN_DATE_MILL=`expr $MIN_DATE_NANO / 1000000`
echo "[`date '+%Y-%m-%d %H:%M:%S'`] start............................................." >> /root/cron_config/mongo_sweeper/mongo_swepper.log
mongo mongo_server_ip:27017<"user","password");
db.dbIndicators.find({"CREATE_TIME":{\$lt:$MIN_DATE_MILL}},{"_id":1}).forEach(function(item){db.dbIndicators.remove({"_id":item._id});});
exit;
EOF
echo "[`date '+%Y-%m-%d %H:%M:%S'`] end............................................." >> /root/cron_config/mongo_sweeper/mongo_swepper.log
crontab
:crontab -e
#
#
#input>>>>>>>>>>>>>
0 2 * * * sh /root/cron_config/mongo_sweeper/mongo_swepper.sh >> /root/cron_config/mongo_sweeper/mongo_swepper.log
#input>>>>>>>>>>>>>
# OK
テストは正常です.
Model Time Data ↩