如果我有一个类似于以下内容的redis hmap:
client.hset('test', 'one', 'aaa');
client.hset('test', 'two', 'bbb');
client.hset('test', 'three', 'ccc');
client.hset('test', 'four', 'ddd');
我想知道地图是否有像ccc
这样的值最好的方法吗?
我可以打电话给
client.hgetall('test', function(err, obj){
for(id in obj){
if(obj[id] == 'ccc'){
return id;
}
}
});
但这看起来非常低效,redis中是否有搜索或查找方法可以产生更好的解决方案?
答案 0 :(得分:1)
没有按值搜索的内置方式。如果你想提高效率,你必须建立一个从值到键的倒排索引,例如倒测试。每次更新 test 哈希时,也要更新反向索引。
HSET test one aaa
HSET inverted-test aaa one
注意强>
如果在原始哈希中,多个键可能具有相同的值。您可能需要使用LIST
实现倒排索引。
HSET test one aaa
LPUSH inverted-test:aaa one
HSET test two aaa
LPUSH inverted-test:aaa two
答案 1 :(得分:0)
您可以使用filter方法,如下所示:
client.hgetall('test', (err, obj) => {
// in here we create an array of the object obj properties
const keys = Object.keys(obj);
// and now we iterate that array with the filter method
const wantedValues = keys.filter(key => obj[key] === 'ccc');
// wantedValues is now a array with the keys of the object obj that have the value ccc
});