diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index bef52a57dc..672de041be 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -82,10 +82,10 @@ module.exports = function (module) { } let result = []; - async function doQuery(_key, fields) { + async function doQuery(_key, fields, skip, limit) { return await module.client.collection('objects').find({ ...query, ...{ _key: _key } }, { projection: fields }) .sort({ score: sort }) - .skip(start) + .skip(skip) .limit(limit) .toArray(); } @@ -93,11 +93,15 @@ module.exports = function (module) { if (isArray && key.length > 100) { const batches = []; const batch = require('../../batch'); - await batch.processArray(key, async currentBatch => batches.push(currentBatch), { batch: 100 }); - const batchData = await Promise.all(batches.map(batch => doQuery({ $in: batch }, { _id: 0, _key: 0 }))); - result = dbHelpers.mergeBatch(batchData, start, stop, sort); + const batchSize = Math.ceil(key.length / Math.ceil(key.length / 100)); + await batch.processArray(key, async currentBatch => batches.push(currentBatch), { batch: batchSize }); + const batchData = await Promise.all(batches.map(batch => doQuery({ $in: batch }, { _id: 0, _key: 0 }, 0, stop + 1))); + result = dbHelpers.mergeBatch(batchData, 0, stop, sort); + if (start > 0) { + result = result.slice(start, stop !== -1 ? stop + 1 : undefined); + } } else { - result = await doQuery(query._key, fields); + result = await doQuery(query._key, fields, start, limit); } if (reverse) { diff --git a/src/database/redis/sorted.js b/src/database/redis/sorted.js index f0e1b1f2eb..2ced68c2d0 100644 --- a/src/database/redis/sorted.js +++ b/src/database/redis/sorted.js @@ -32,13 +32,16 @@ module.exports = function (module) { return []; } const batch = module.client.batch(); - key.forEach(key => batch[method]([key, start, stop, 'WITHSCORES'])); + key.forEach(key => batch[method]([key, 0, stop, 'WITHSCORES'])); const data = await helpers.execBatch(batch); const batchData = data.map(setData => helpers.zsetToObjectArray(setData)); - let objects = dbHelpers.mergeBatch(batchData, start, stop, method === 'zrange' ? 1 : -1); + let objects = dbHelpers.mergeBatch(batchData, 0, stop, method === 'zrange' ? 1 : -1); + if (start > 0) { + objects = objects.slice(start, stop !== -1 ? stop + 1 : undefined); + } if (!withScores) { objects = objects.map(item => item.value); } diff --git a/test/database/sorted.js b/test/database/sorted.js index dea568750e..52f0e88a50 100644 --- a/test/database/sorted.js +++ b/test/database/sorted.js @@ -279,6 +279,9 @@ describe('Sorted Set methods', function () { data = await db.getSortedSetRevRange(keys, 0, -1); assert.equal(data.length, 40000); + + data = await db.getSortedSetRange(keys, 9998, 10002); + assert.deepStrictEqual(data, ['9998', '9999', '10000', '10001', '10002']); }); });