// compact.js var mydb = db.getSiblingDB('compact'); t = mydb.compacttest; t.drop(); // Assert that you can't compact a capped collection in MMAP. assert.commandWorked(mydb.createCollection(t.getName(), {size: 4096, capped: true})); assert.commandFailedWithCode(t.runCommand('compact'), ErrorCodes.CommandNotSupported); t.drop(); // uncap the collection. t.insert({ x: 3 }); t.insert({ x: 3 }); t.insert({ x: 5 }); t.insert({ x: 4, z: 2, k: 'aaa' }); t.insert({ x: 4, z: 2, k: 'aaa' }); t.insert({ x: 4, z: 2, k: 'aaa' }); t.insert({ x: 4, z: 2, k: 'aaa' }); t.insert({ x: 4, z: 2, k: 'aaa' }); t.insert({ x: 4, z: 2, k: 'aaa' }); t.ensureIndex({ x: 1 }); print("1"); var res = mydb.runCommand({ compact: 'compacttest', dev: true, force: true }); printjson(res); assert(res.ok); assert(t.count() == 9); var v = t.validate(true); assert(v.ok); assert(v.extentCount == 1); assert(v.deletedCount == 1); assert(t.getIndexes().length == 2); var ssize = t.stats().storageSize; print("2"); res = mydb.runCommand({ compact: 'compacttest', dev: true,paddingBytes:1000, force:true }); assert(res.ok); assert(t.count() == 9); var v = t.validate(true); assert(v.ok); assert(t.stats().storageSize > ssize, "expected more storage given padding is higher. however it rounds off so if something changed this could be"); //printjson(t.stats()); print("z"); t.insert({ x: 4, z: 2, k: { a: "", b: ""} }); t.insert({ x: 4, z: 2, k: { a: "", b: ""} }); t.insert({ x: 4, z: 2, k: { a: "", b: ""} }); t.insert({ x: 4, z: 2, k: { a: "", b: ""} }); t.insert({ x: 4, z: null, k: { f: "", b: ""} }); t.insert({ x: 4, z: null, k: { c: ""} }); t.insert({ x: 4, z: null, k: { h: ""} }); t.insert({ x: 4, z: null }); t.insert({ x: 4, z: 3}); t.insert({ x: 4, z: 2, k: { a: "", b: ""} }); t.insert({ x: 4, z: null, k: { c: ""} }); t.insert({ x: 4, z: null, k: { c: ""} }); t.insert({ x: 4, z: 3, k: { c: ""} }); t.ensureIndex({ z: 1, k: 1 }); //t.ensureIndex({ z: 1, k: 1 }, { unique: true }); //t.ensureIndex({ z: 1, k: 1 }, { dropDups: true, unique:true }); res = mydb.runCommand({ compact: 'compacttest', dev: true, paddingFactor: 1.2, force:true }); printjson(res); assert(res.ok); assert(t.count() > 13); var v = t.validate(true); assert(v.ok); print("3"); // works on an empty collection? t.remove({}); assert(mydb.runCommand({ compact: 'compacttest', dev: true, force:true }).ok); assert(t.count() == 0); v = t.validate(true); assert(v.ok); assert(v.extentCount == 1); assert(t.getIndexes().length == 3);