Last active
March 13, 2019 18:44
-
-
Save ar2rsawseen/01e24d640d3e4df82762323b8e2c5d72 to your computer and use it in GitHub Desktop.
To delete or rename segment keys in Countly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//place script in countly root folder | |
//Use this script to delete or update segment Keys. | |
var pluginManager = require('./plugins/pluginManager.js'), | |
crypto = require('crypto'), | |
Promise = require("bluebird"), | |
countlyDb = pluginManager.dbConnection(), | |
countly_drill = pluginManager.dbConnection("countly_drill"); | |
var appId = "5c615b38441c5f498a492694"; //Your app id | |
var eventKey = "Lost"; //Your event key | |
var segmentsToUpdate = [{"level": "difficulty"}, {"mode": ""}]; //list of segment keys to delete or rename. Key - old segment name, Value - new segment name. If value is "", then deleted | |
//so segment level will be renamed to difficulty | |
// segment mode will be deleted | |
var collectionNameWoPrefix = crypto.createHash('sha1').update(eventKey + appId).digest('hex'); | |
var collection = "events" + collectionNameWoPrefix; | |
Promise.each(segmentsToUpdate, function(segment) { | |
return new Promise(function(resolve, reject) { | |
var newvalue = ""; | |
var oldvalue = ""; | |
if (typeof segment === 'object') { | |
oldvalue = Object.keys(segment)[0]; | |
newvalue = segment[oldvalue]; | |
} | |
if (oldvalue === "") { | |
resolve(); | |
return; | |
} | |
console.log("Processing: " + oldvalue + " -> " + newvalue); | |
if (newvalue == "") { //delete segment key | |
countlyDb.collection(collection).remove({"s": oldvalue}, function() { //removes from month values | |
var unset = {}; | |
unset["meta_v2.segments." + oldvalue] = ""; | |
unset["meta_v2." + oldvalue] = ""; | |
countlyDb.collection(collection).update({}, {$unset: unset}, {multi: true}, function(err, res) { //removes from zero docs | |
if (err) { | |
console.log(err); | |
} | |
if (countly_drill) { | |
console.log("Updating drill collection"); | |
var rule = {}; | |
rule["sg." + oldvalue] = ""; | |
var finder = {}; | |
finder["sg." + oldvalue] = {$exists: true}; | |
countly_drill.collection("drill_events" + collectionNameWoPrefix).update(finder, {$unset: rule}, {multi: "true"}, function(err, res) { | |
resolve(); | |
}); | |
} | |
else { | |
resolve(); | |
} | |
}); | |
}); | |
} | |
else { //rename segment key | |
console.log("Processing month documents..."); | |
var promises = []; | |
countlyDb.collection(collection).find({"s": oldvalue}).forEach(function(data) { | |
data["s"] = newvalue; | |
var oldid = data["_id"]; | |
data["_id"] = data["_id"].replace(oldvalue, newvalue); | |
var p = new Promise(function(resolve1, reject1) { | |
countlyDb.collection(collection).findOne({"_id": data["_id"]}, function(err, res) { | |
if (res) { //then merging values | |
for (var z in data['d']) { | |
if (!res['d'][z]) { | |
res['d'][z] = {}; | |
} | |
for (var p in data['d'][z]) { | |
if (!res['d'][z][p]) { | |
res['d'][z][p] = {}; | |
} | |
for (var att in data['d'][z][p]) { | |
res['d'][z][p][att] = res['d'][z][p][att] || 0; | |
res['d'][z][p][att] += data['d'][z][p][att]; | |
} | |
} | |
} | |
countlyDb.collection(collection).replaceOne({"_id": res["_id"]}, res, {upsert: true}, function(err, res) { | |
countlyDb.collection(collection).remove({"_id": oldid}, function() { | |
resolve1(); | |
}); | |
}); | |
} | |
else { //replacing | |
countlyDb.collection(collection).insert(data, function(err, res) { | |
resolve1(); | |
}); | |
} | |
}); | |
}); | |
promises.push(p); | |
}, function() { | |
//remove all old | |
Promise.all(promises).then(function() { | |
promises = []; | |
console.log("Updating zero documents..."); | |
countlyDb.collection(collection).find({"s": "no-segment", "m": {$regex: ".*:0"}}).forEach(function(data) { | |
if (data['meta_v2'][oldvalue]) { | |
data['meta_v2'][newvalue] = data['meta_v2'][newvalue] || {}; | |
for (var k in data['meta_v2'][oldvalue]) { | |
data['meta_v2'][newvalue][k] = data['meta_v2'][oldvalue][k]; | |
} | |
delete data['meta_v2'][oldvalue]; | |
} | |
if (data['meta_v2']['segments'] && data['meta_v2']['segments'][oldvalue]) { | |
data['meta_v2']['segments'][newvalue] = data['meta_v2']['segments'][oldvalue]; | |
delete data['meta_v2']['segments'][oldvalue]; | |
} | |
var p = new Promise(function(resolve1, reject1) { | |
countlyDb.collection(collection).replaceOne({"_id": data["_id"]}, data, function(err, res) { | |
if (err) { | |
console.log(err); | |
} | |
resolve1(); | |
}); | |
}); | |
promises.push(p); | |
}, function() { | |
Promise.all(promises).then(function() { | |
if (countly_drill) { | |
console.log("Updating drill collection"); | |
var rule = {}; | |
rule["sg." + oldvalue] = "sg." + newvalue; | |
var finder = {}; | |
finder["sg." + oldvalue] = {$exists: true}; | |
countly_drill.collection("drill_events" + collectionNameWoPrefix).update(finder, {$rename: rule}, {multi: "true"}, function(err, res) { | |
resolve(); | |
}); | |
} | |
else { | |
resolve(); | |
} | |
}); | |
}); | |
}); | |
}); | |
} | |
}); | |
}).then(function() { | |
console.log("finished"); | |
countlyDb.close(); | |
if (countly_drill) { | |
countly_drill.close(); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment