diff --git a/src/database/mongo/main.js b/src/database/mongo/main.js index 3ab4aa41a7..7c7d430a10 100644 --- a/src/database/mongo/main.js +++ b/src/database/mongo/main.js @@ -25,9 +25,24 @@ module.exports = function (db, module) { if (!key) { return callback(); } - db.collection('objects').findOne({ _key: key }, function (err, item) { - callback(err, item !== undefined && item !== null); - }); + if (Array.isArray(key)) { + db.collection('objects').find({ _key: { $in: key } }).toArray(function (err, data) { + if (err) { + return callback(err); + } + + var map = {}; + data.forEach(function (item) { + map[item._key] = true; + }); + + callback(null, key.map(key => !!map[key])); + }); + } else { + db.collection('objects').findOne({ _key: key }, function (err, item) { + callback(err, item !== undefined && item !== null); + }); + } }; module.delete = function (key, callback) { diff --git a/src/database/postgres/main.js b/src/database/postgres/main.js index 2dcc6ecd5e..ab064894ac 100644 --- a/src/database/postgres/main.js +++ b/src/database/postgres/main.js @@ -30,21 +30,42 @@ module.exports = function (db, module) { return callback(); } - query({ - name: 'exists', - text: ` -SELECT EXISTS(SELECT * - FROM "legacy_object_live" - WHERE "_key" = $1::TEXT - LIMIT 1) e`, - values: [key], - }, function (err, res) { - if (err) { - return callback(err); - } + if (Array.isArray(key)) { + query({ + name: 'exists', + text: ` + SELECT o."_key" k + FROM "legacy_object_live" o + WHERE o."_key" = ANY($1::TEXT[])`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } - callback(null, res.rows[0].e); - }); + callback(null, key.map(function (k) { + return res.rows.some(function (r) { + return r.k === k; + }); + })); + }); + } else { + query({ + name: 'exists', + text: ` + SELECT EXISTS(SELECT * + FROM "legacy_object_live" + WHERE "_key" = $1::TEXT + LIMIT 1) e`, + values: [key], + }, function (err, res) { + if (err) { + return callback(err); + } + + callback(null, res.rows[0].e); + }); + } }; module.delete = function (key, callback) { diff --git a/src/database/redis/main.js b/src/database/redis/main.js index ccf623432e..9c93560ee0 100644 --- a/src/database/redis/main.js +++ b/src/database/redis/main.js @@ -1,6 +1,8 @@ 'use strict'; module.exports = function (redisClient, module) { + var helpers = module.helpers.redis; + module.flushdb = function (callback) { redisClient.send_command('flushdb', [], function (err) { if (typeof callback === 'function') { @@ -20,9 +22,15 @@ module.exports = function (redisClient, module) { }; module.exists = function (key, callback) { - redisClient.exists(key, function (err, exists) { - callback(err, exists === 1); - }); + if (Array.isArray(key)) { + helpers.multiKeys(redisClient, 'exists', key, function (err, data) { + callback(err, data && data.map(exists => exists === 1)); + }); + } else { + redisClient.exists(key, function (err, exists) { + callback(err, exists === 1); + }); + } }; module.delete = function (key, callback) { diff --git a/test/database/keys.js b/test/database/keys.js index 4d9354c6b6..cbd763465d 100644 --- a/test/database/keys.js +++ b/test/database/keys.js @@ -53,6 +53,14 @@ describe('Key methods', function () { }); }); + it('should work for an array of keys', function (done) { + db.exists(['testKey', 'doesnotexist'], function (err, exists) { + assert.ifError(err); + assert.deepStrictEqual(exists, [true, false]); + done(); + }); + }); + it('should delete a key without error', function (done) { db.delete('testKey', function (err) { assert.ifError(err);