Skip to content

Instantly share code, notes, and snippets.

@ar2rsawseen
Created March 13, 2019 18:46
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/43ca96283abf933bb971cc83b51484ff to your computer and use it in GitHub Desktop.
Save ar2rsawseen/43ca96283abf933bb971cc83b51484ff to your computer and use it in GitHub Desktop.
To delete or rename segment values in Countly
//place script in countly root folder (if anywhere else fix path to pluginManager and common)
//Use this script to delete or update segment Values.
var pluginManager = require('./plugins/pluginManager.js'),
crypto = require('crypto'),
async = require('async'),
Promise = require("bluebird"),
common = require('./api/utils/common.js'),
countlyDb = pluginManager.dbConnection(),
countly_drill = pluginManager.dbConnection("countly_drill");
var appId = "5c615b38441c5f498a492694"; //Your app id
var eventKey= "Achievement"; //Your event key
var segmentsToUpdate = [{"title":{"Tester":"Tester2", "Shooter": "", "Jumper":"Runner"}}]; //list of segment values to delete or rename;
// ey - old segment value, Value - new value. If value is "", then deleted
// o in segment "title" we will
// rename value of the segment "title" from "Tester" to "Tester2"
// and from "Jumper" to "Runner"
// and we will delete value "Shooter" from segment "title
var bulk_size=1000; //max operation count to pass for bulk operation
//
var collection = "events" + crypto.createHash('sha1').update(eventKey + appId).digest('hex');
var collectionNameWoPrefix = crypto.createHash('sha1').update(eventKey + appId).digest('hex');
Promise.each(segmentsToUpdate,function(segmentOp) {
return new Promise(function(resolve, reject) {
countlyDb.onOpened(async function() {
var bulk = countlyDb._native.collection(collection).initializeUnorderedBulkOp();
var segment = Object.keys(segmentOp)[0]; //segment key
//in monthly docs
console.log("Processing for: "+segment);
var cursor = countlyDb._native.collection(collection).find({"s":segment});
console.log("processing month documents...");
for (let data = await cursor.next(); data !== null; data = await cursor.next()) {
for(var key in segmentOp[segment]) {
var delete_me = true;
var update_this = false;
var replace_this = false;
var postfix = "";
var newkey = segmentOp[segment][key];
var updateObj = {};
if(segmentOp[segment][key] !== "") { //rename this one
delete_me = false;
postfix = common.crypto.createHash("md5").update(segmentOp[segment][key]).digest('base64')[0];
updateObj['$inc'] = {};
}
for (var z in data['d']) {
for (var p in data['d'][z] ){
if(p == key ) {
if(!delete_me) {
for(var att in data['d'][z][p]) {
updateObj['$inc']['d.'+z+'.'+newkey+'.'+att] = data['d'][z][p][att]; //$inc - so we can merge
}
}
delete data['d'][z][p];
replace_this = true;
}
}
}
if(replace_this) {
bulk.find({"_id":data["_id"]}).replaceOne(data);
}
if(updateObj['$inc'] && Object.keys( updateObj['$inc']).length>0 ) {
console.log(updateObj);
var iid = data['_id'].substring(0,data['_id'].length-1)+postfix;
updateObj['$set'] = {'s':segment, 'm':data['m'], '_id':iid}
bulk.find({"_id":iid}).upsert().updateOne(updateObj);
}
}
if(bulk.length>bulk_size ) {
var res = await bulk.execute();
bulk = countlyDb._native.collection(collection).initializeUnorderedBulkOp();
console.log(res);
}
}
console.log("finished fetching all month documents");
if(bulk.length>0 ) {
var res = await bulk.execute();
bulk = countlyDb._native.collection(collection).initializeUnorderedBulkOp();
console.log(res);
}
console.log("processing year documents...");
cursor = countlyDb._native.collection(collection).find({"s":"no-segment", "m":{$regex:".*:0"}});
for (let data = await cursor.next(); data !== null; data = await cursor.next()) {
for(var key in segmentOp[segment]) {
var delete_me = true;
var update_this = false;
var replace_this = false;
var postfix = common.crypto.createHash("md5").update(segmentOp[segment][key]).digest('base64')[0];
var updateObj = {};
if(segmentOp[segment][key] !== ""){ //delete this one
delete_me = false;
}
if(data['meta_v2'] && data['meta_v2'][segment] && data['meta_v2'][segment][key]) {
delete data['meta_v2'][segment][key];
var unset ={};
unset['meta_v2.'+segment+'.'+key] = "";
bulk.find({_id:data['_id']}).updateOne({$unset:unset});
if(delete_me === false ){
var iid = data['_id'].substring(0,data['_id'].length-1)+postfix;
var set_me ={"m":data["m"],"s":data["s"]};
set_me['meta_v2.'+segment+'.'+segmentOp[segment][key]] = true;
bulk.find({_id:iid}).upsert().updateOne({$set:set_me})
}
}
}
if(bulk.length>bulk_size ) {
var res = await bulk.execute();
bulk = countlyDb._native.collection(collection).initializeUnorderedBulkOp();
console.log(res);
}
}
if(bulk.length>0) {
var res = await bulk.execute();
bulk = countlyDb._native.collection(collection).initializeUnorderedBulkOp();
console.log(res);
}
if(countly_drill) {
console.log("Updating drill collection");
var keys = Object.keys(segmentOp[segment]);
Promise.each(keys, function(key){
return new Promise(function(resolve1, reject1) {
var newkey = segmentOp[segment][key];
var updateObj = {};
var find_rule = {};
find_rule['sg.'+segment] = key;
if(segmentOp[segment][key] === "") {
var unset_rule = {};
unset_rule['sg.'+segment] = "";
countly_drill.collection("drill_events" + collectionNameWoPrefix).update(find_rule,{$unset:unset_rule},{multi:"true"}, function(err,res){
if(err) {
console.log(err);
}
resolve1();
});
}
else {
var set_rule = {};
set_rule['sg.'+segment] = newkey;
countly_drill.collection("drill_events" + collectionNameWoPrefix).update(find_rule,{$set:set_rule},{multi:"true"}, function(err,res){
if(err) {
console.log(err);
}
resolve1();
});
}
});
}).then(function(){
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