在hmap中搜索值

时间:2017-03-23 20:50:25

标签: node.js redis

如果我有一个类似于以下内容的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中是否有搜索或查找方法可以产生更好的解决方案?

2 个答案:

答案 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
});