Skip to content

Instantly share code, notes, and snippets.

@ar2rsawseen
Last active March 13, 2019 18:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ar2rsawseen/01e24d640d3e4df82762323b8e2c5d72 to your computer and use it in GitHub Desktop.
Save ar2rsawseen/01e24d640d3e4df82762323b8e2c5d72 to your computer and use it in GitHub Desktop.
To delete or rename segment keys in Countly
//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