Created
March 13, 2019 18:46
-
-
Save ar2rsawseen/43ca96283abf933bb971cc83b51484ff to your computer and use it in GitHub Desktop.
To delete or rename segment values 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 (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