MongoDBタイミングデータ削除

5345 ワード

MongoDBタイミングデータ削除

  • MongoDBタイミング削除データ
  • mongo削除範囲データ
  • TTL
  • expireAfterSeconds: xx
  • expireAfterSeconds: 0

  • crontab


  • 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

  • この方法は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 ↩