Я хочу обновить свой SET. Я видел, что это невозможно, но я могу снова сделать SREM и SADD.
Проблема в том, что я не могу найти старое значение с помощью SREM. Мои данные:
{"owner_id":30902468,"qu1":{"q1":"test","a1":"test"},"qu2":{"q2":"test","a2":"test"},"qu3":{"q3":"test","a3":"test"},"created_at":1648925484846,"score":1,"ip":"NA"}
Я могу получить это с помощью owner_id, что я и сделал await redis.srem("qa", backtick{"owner_id":${owner_id}*backtick);
Однако это не работает.
Вот мой полный код:
import Redis from "ioredis";
export default async function create(req, res) {
const redis = new Redis(process.env.U_REDIS_URL);
const { q1, a1, q2, a2, q3, a3, owner_id } = req.body;
if (!q1 && !a1) {
res.status(400).json({
error: "Type at least one question",
});
} else if (q1.length < 150) {
const newEntry = {
owner_id,
qu1: { q1, a1 },
qu2: { q2, a2 },
qu3: { q3, a3 },
created_at: Date.now(),
score: 1,
ip: "NA",
};
await redis.srem("qa", `{"owner_id":${owner_id}*`); // THIS IS NOT WORKING - DONT KNOW HOW TO GET OLD VALUE
await redis.sadd("qa", JSON.stringify(newEntry));
res.status(200).json({
body: "success",
});
} else {
res.status(400).json({
error: "Max 150 characters please.",
});
}
await redis.quit();
}
Команда SREM
не может быть подстановочной. Это просто не сработает. Чтобы удалить элемент из набора, вы должны предоставить весь элемент. Так, например:
> SADD foo apple
> SADD foo alpine
> SADD foo alpha
Чтобы заменить яблоко бананом, нельзя ввести SREM foo ap*
, а затем SADD foo banana
. Вы должны сопоставить весь элемент:
> SREM foo apple
> SADD foo banana
Основываясь на вашем примере, я думаю, что лучшим решением было бы сохранить вашу строку JSON в строке (или, возможно, RedisJSON, если это вариант) с ключом qa:30902468
, а затем просто сохранить идентификаторы владельцев в наборе.
> SET qa:30902468 '{"owner_id":30902468,"qu1":{"q1":"test","a1":"test"},"qu2":{"q2":"test","a2":"test"},"qu3":{"q3":"test","a3":"test"},"created_at":1648925484846,"score":1,"ip":"NA"}'
> SADD qa 30902468
Затем, когда вам нужно изменить строку, вы просто меняете строку:
> SET qa:30902468 '{ "some": "other", "JSON": true }'
И когда вам нужно прочитать все вещи в наборе, просто спросите у набора идентификаторы:
> SMEMBERS qa
1) "30902468"
2) "30902469"
3) "30902470"
А затем запросите строки на основе возвращенных идентификаторов:
> GET qa:30902468
> GET qa:30902469
> GET qa:30902470
В основном вы здесь управляете своим собственным индексом с помощью наборов в Redis.
Спасибо за ответ! Но, кажется, я нашел другой способ :) Ваш способ полезнее: gist.github.com/ekofi/5dd7ee416f4c5e4b63376029995736bc