我想更新我的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字符串存储在一个密钥为qa:30902468
的string(或者RedisJSON,如果可以的话(中,然后将所有者ID存储在Set中。
> 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
然后,当您需要更改字符串时,只需更改string:
> SET qa:30902468 '{ "some": "other", "JSON": true }'
当你需要阅读集合中的所有内容时,只需向集合询问ID:
> SMEMBERS qa
1) "30902468"
2) "30902469"
3) "30902470"
然后根据返回的ID查询字符串:
> GET qa:30902468
> GET qa:30902469
> GET qa:30902470
您在这里基本上要做的是使用Redis中的Sets来管理自己的索引。