Skip to content

Instantly share code, notes, and snippets.

@leandromoh
Created March 3, 2022 15:48
Show Gist options
  • Save leandromoh/3bbe9c7e6ccf1bf2a09ce2fde06c11d9 to your computer and use it in GitHub Desktop.
Save leandromoh/3bbe9c7e6ccf1bf2a09ce2fde06c11d9 to your computer and use it in GitHub Desktop.
compares the time of doing a single mongo bulk write vs divide all operations in N bulks
function createRandomObj(fieldCount, allowNested) {
var generatedObj = {};
for(var i = 0; i < fieldCount; i++) {
var generatedObjField;
switch(randomInt(allowNested ? 6 : 5)) {
case 0:
generatedObjField = randomInt(1000);
break;
case 1:
generatedObjField = Math.random();
break;
case 2:
generatedObjField = Math.random() < 0.5 ? true : false;
break;
case 3:
generatedObjField = randomString(randomInt(4) + 4);
break;
case 4:
generatedObjField = null;
break;
case 5:
generatedObjField = createRandomObj(fieldCount, allowNested);
break;
}
generatedObj[randomString(8)] = generatedObjField;
}
return generatedObj;
function randomInt(rightBound){
return Math.floor(Math.random() * rightBound);
}
function randomString(size){
var alphaChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var generatedString = '';
for(var i = 0; i < size; i++) {
generatedString += alphaChars[randomInt(alphaChars.length)];
}
return generatedString;
}
}
function chunkArrayInGroups(arr, size) {
var myArray = [];
for(var i = 0; i < arr.length; i += size) {
myArray.push(arr.slice(i, i+size));
}
return myArray;
}
function getInserts(count) {
var objs = [...Array(count).keys()].map(_ => {
var item = createRandomObj(4, false);
return {
"insertOne": {
"document": item,
}
};
});
print(`[${Date()}] - gerado commands para ${count} itens`);
return objs;
}
function executeBulk(bulkOperations) {
var result = db.orders.bulkWrite(bulkOperations, { "ordered": false });
print(`${bulkOperations.length] operations done`);
}
function doBulk(itenCount, bulkCount) {
var start = new Date();
var operations = getInserts(itenCount);
var part = itenCount / bulkCount;
var bulkOperations = chunkArrayInGroups(operations, part);
for(var i = 0; i < bulkCount; i++)
{
executeBulk(bulkOperations[i]);
}
var end = new Date();
const diffTime = Math.abs(end - start);
print(`total time = ${diffTime} ms`);
}
doBulk(10000, 1);
doBulk(10000, 2);
doBulk(10000, 3);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment