diff --git a/src/database/mongo/main.js b/src/database/mongo/main.js index 77f1f1409c..aa5892389b 100644 --- a/src/database/mongo/main.js +++ b/src/database/mongo/main.js @@ -24,12 +24,8 @@ module.exports = function (module) { _key: { $in: key }, }, { _id: 0, _key: 1 }).toArray(); - const map = Object.create(null); - data.forEach((item) => { - map[item._key] = true; - }); - - return key.map(key => !!map[key]); + const foundKeys = new Set(data.map(item => item._key)); + return key.map(key => foundKeys.has(key)); } const item = await module.client.collection('objects').findOne({ @@ -76,7 +72,9 @@ module.exports = function (module) { return; } - const objectData = await module.client.collection('objects').findOne({ _key: key }, { projection: { _id: 0 } }); + const objectData = await module.client.collection('objects').findOne( + { _key: key }, { projection: { _id: 0 } } + ); // fallback to old field name 'value' for backwards compatibility #6340 let value = null; @@ -100,12 +98,12 @@ module.exports = function (module) { { projection: { _id: 0 } } ).toArray(); - const map = {}; + const map = Object.create(null); data.forEach((d) => { map[d._key] = d.data; }); - return keys.map(k => (map.hasOwnProperty(k) ? map[k] : null)); + return keys.map(k => map[k] !== undefined ? map[k] : null); }; module.set = async function (key, value) { diff --git a/src/database/mongo/sets.js b/src/database/mongo/sets.js index 66b4baebab..32e81f37b1 100644 --- a/src/database/mongo/sets.js +++ b/src/database/mongo/sets.js @@ -128,7 +128,7 @@ module.exports = function (module) { const item = await module.client.collection('objects').findOne({ _key: key, members: value, }, { - projection: { _id: 0, _key: 1}, + projection: { _id: 0, _key: 1 }, }); return item !== null && item !== undefined; @@ -177,12 +177,8 @@ module.exports = function (module) { projection: { _id: 0, _key: 1 }, }).toArray(); - const map = {}; - result.forEach((item) => { - map[item._key] = true; - }); - - return sets.map(set => !!map[set]); + const foundMembers = new Set(result.map(item => item._key)); + return sets.map(set => foundMembers.has(set)); }; module.getSetMembers = async function (key) { @@ -208,7 +204,7 @@ module.exports = function (module) { projection: { _id: 0 }, }).toArray(); - const sets = {}; + const sets = Object.create(null); data.forEach((set) => { sets[set._key] = set.members || []; }); diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 9940cf2677..b5de27ef6b 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -271,7 +271,10 @@ module.exports = function (module) { return null; } value = helpers.valueToString(value); - const result = await module.client.collection('objects').findOne({ _key: key, value: value }, { projection: { _id: 0, _key: 0, value: 0 } }); + const result = await module.client.collection('objects').findOne( + { _key: key, value: value }, + { projection: { _id: 0, _key: 0, value: 0 } } + ); return result ? result.score : null; }; @@ -280,15 +283,15 @@ module.exports = function (module) { return []; } value = helpers.valueToString(value); - const result = await module.client.collection('objects').find({ _key: { $in: keys }, value: value }, { projection: { _id: 0, value: 0 } }).toArray(); - const map = {}; + const result = await module.client.collection('objects').find( + { _key: { $in: keys }, value: value }, + { projection: { _id: 0, value: 0 } } + ).toArray(); + const scoreMap = Object.create(null); result.forEach((item) => { - if (item) { - map[item._key] = item; - } + scoreMap[item._key] = item.score; }); - - return keys.map(key => (map[key] ? map[key].score : null)); + return keys.map(key => (scoreMap[key] !== undefined ? scoreMap[key] : null)); }; module.sortedSetScores = async function (key, values) { @@ -299,13 +302,14 @@ module.exports = function (module) { return []; } values = values.map(helpers.valueToString); - const result = await module.client.collection('objects').find({ _key: key, value: { $in: values } }, { projection: { _id: 0, _key: 0 } }).toArray(); + const result = await module.client.collection('objects').find( + { _key: key, value: { $in: values } }, + { projection: { _id: 0, _key: 0 } } + ).toArray(); - const valueToScore = {}; + const valueToScore = Object.create(null); result.forEach((item) => { - if (item) { - valueToScore[item.value] = item.score; - } + valueToScore[item.value] = item.score; }); return values.map(v => (utils.isNumber(valueToScore[v]) ? valueToScore[v] : null)); @@ -338,14 +342,8 @@ module.exports = function (module) { projection: { _id: 0, value: 1 }, }).toArray(); - const isMember = {}; - results.forEach((item) => { - if (item) { - isMember[item.value] = true; - } - }); - - return values.map(value => !!isMember[value]); + const foundMembers = new Set(results.map(item => item.value)); + return values.map(value => foundMembers.has(value)); }; module.isMemberOfSortedSets = async function (keys, value) { @@ -359,14 +357,8 @@ module.exports = function (module) { projection: { _id: 0, _key: 1, value: 1 }, }).toArray(); - const isMember = {}; - results.forEach((item) => { - if (item) { - isMember[item._key] = true; - } - }); - - return keys.map(key => !!isMember[key]); + const keysWithMember = new Set(results.map(item => item._key)); + return keys.map(key => keysWithMember.has(key)); }; module.getSortedSetMembers = async function (key) { @@ -411,7 +403,7 @@ module.exports = function (module) { data.map(item => item.value), ]; } - const sets = {}; + const sets = Object.create(null); data.forEach((item) => { sets[item._key] = sets[item._key] || []; if (withScores) { diff --git a/src/database/mongo/sorted/remove.js b/src/database/mongo/sorted/remove.js index d6bf96fa7e..80545d56fe 100644 --- a/src/database/mongo/sorted/remove.js +++ b/src/database/mongo/sorted/remove.js @@ -56,8 +56,8 @@ module.exports = function (module) { if (!Array.isArray(data) || !data.length) { return; } - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - data.forEach(item => bulk.find({ _key: item[0], value: String(item[1]) }).delete()); - await bulk.execute(); + await module.client.collection('objects').deleteMany({ + $or: data.map(([key, value]) => ({ _key: key, value: String(value) })), + }); }; }; diff --git a/test/database/keys.js b/test/database/keys.js index 673d083f98..84a3a7d495 100644 --- a/test/database/keys.js +++ b/test/database/keys.js @@ -44,6 +44,12 @@ describe('Key methods', () => { assert.deepStrictEqual(await db.mget(null), []); }); + it('should return 0 if value of key is 0', async () => { + await db.set('zeroKey', 0); + const value = await db.mget(['zeroKey']); + assert.strictEqual(value[0], 0); + }); + it('should return true if key exist', (done) => { db.exists('testKey', function (err, exists) { assert.ifError(err);