Skip to content

Instantly share code, notes, and snippets.

@arevindh
Created July 17, 2021 15:22
Show Gist options
  • Save arevindh/5b324c8110d8f25a5b85997420d15b5b to your computer and use it in GitHub Desktop.
Save arevindh/5b324c8110d8f25a5b85997420d15b5b to your computer and use it in GitHub Desktop.
mongo_prune_js.js
// keep N-day worth of data
var days=7;
// change to false to have the script to really exclude old records
// from the database. While true, no change at all will be made to the DB
var dryrun=true;
var now = new Date().getTime(),
time_criteria = now ;
time_criteria_in_seconds = time_criteria / 1000;
print((dryrun ? "[dryrun] " : "") + "pruning data older than " + days + " days (" + time_criteria + ")... ");
use ace;
var collectionNames = db.getCollectionNames();
for (i=0; i<collectionNames.length; i++) {
var name = collectionNames[i];
var query = null;
if (name === 'event' || name === 'alarm') {
query = {time: {$lt:time_criteria}};
}
// if a user was only seen ONCE, $last_seen will not be defined
// so, if $last_seen not defined, lets use $first_seen instead
// also check if $blocked or $use_fixedip is set. If true, do NOT purge the
// entry no matter how old it is. We want blocked/fixed_ip users to continue
// blocked/fixed_ip. Also noted users should not be deleted.
if (name === 'user') {
query = {
blocked: { $ne: true}, use_fixedip: { $ne: true}, noted: { $ne: true}, $or: [
{last_seen: {$lt:time_criteria_in_seconds} },
{last_seen: {$exists: false}, first_seen: {$lt:time_criteria_in_seconds} }
]
};
}
if (query) {
count1 = db.getCollection(name).count();
count2 = db.getCollection(name).find(query).count();
print((dryrun ? "[dryrun] " : "") + "pruning " + count2 + " entries (total " + count1 + ") from " + name + "... ");
if (!dryrun) {
db.getCollection(name).remove(query);
db.runCommand({ compact: name });
}
}
}
if (!dryrun) db.repairDatabase();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment