mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-29 10:06:13 +01:00
feat: allow removing multiple items from list
This commit is contained in:
@@ -54,9 +54,18 @@ module.exports = function (module) {
|
|||||||
if (!key) {
|
if (!key) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
value = helpers.valueToString(value);
|
const isArray = Array.isArray(value);
|
||||||
|
if (isArray) {
|
||||||
|
value = value.map(helpers.valueToString);
|
||||||
|
} else {
|
||||||
|
value = helpers.valueToString(value);
|
||||||
|
}
|
||||||
|
|
||||||
await module.client.collection('objects').updateOne({ _key: key }, { $pull: { array: value } });
|
await module.client.collection('objects').updateOne({
|
||||||
|
_key: key,
|
||||||
|
}, {
|
||||||
|
$pull: { array: isArray ? { $in: value } : value },
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
module.listTrim = async function (key, start, stop) {
|
module.listTrim = async function (key, start, stop) {
|
||||||
|
|||||||
@@ -94,7 +94,11 @@ RETURNING A."array"[array_length(A."array", 1)] v`,
|
|||||||
if (!key) {
|
if (!key) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// TODO: remove all values with one query
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
await Promise.all(value.map(v => module.listRemoveAll(key, v)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
await module.pool.query({
|
await module.pool.query({
|
||||||
name: 'listRemoveAll',
|
name: 'listRemoveAll',
|
||||||
text: `
|
text: `
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
module.exports = function (module) {
|
module.exports = function (module) {
|
||||||
|
const helpers = require('./helpers');
|
||||||
|
|
||||||
module.listPrepend = async function (key, value) {
|
module.listPrepend = async function (key, value) {
|
||||||
if (!key) {
|
if (!key) {
|
||||||
return;
|
return;
|
||||||
@@ -26,7 +28,13 @@ module.exports = function (module) {
|
|||||||
if (!key) {
|
if (!key) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await module.client.lrem(key, 0, value);
|
if (Array.isArray(value)) {
|
||||||
|
const batch = module.client.batch();
|
||||||
|
value.forEach(value => batch.lrem(key, 0, value));
|
||||||
|
await helpers.execBatch(batch);
|
||||||
|
} else {
|
||||||
|
await module.client.lrem(key, 0, value);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
module.listTrim = async function (key, start, stop) {
|
module.listTrim = async function (key, start, stop) {
|
||||||
|
|||||||
@@ -188,6 +188,15 @@ describe('List methods', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should remove multiple elements from list', async () => {
|
||||||
|
await db.listAppend('multiRemoveList', ['a', 'b', 'c', 'd', 'e']);
|
||||||
|
const initial = await db.getListRange('multiRemoveList', 0, -1);
|
||||||
|
assert.deepStrictEqual(initial, ['a', 'b', 'c', 'd', 'e']);
|
||||||
|
await db.listRemoveAll('multiRemoveList', ['b', 'd']);
|
||||||
|
const values = await db.getListRange('multiRemoveList', 0, -1);
|
||||||
|
assert.deepStrictEqual(values, ['a', 'c', 'e']);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('listTrim()', () => {
|
describe('listTrim()', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user