2011-04-18 132 views
26

我使用node_redis,我想救如下的结构:保存嵌套的哈希

{ 
users : 
    "alex" : { "email" : "[email protected]", 
      "password" : "alex123"}, 
    "sandra" : { "email" : "[email protected]", 
      "password" : "sandra123"}, 
    ... 
} 

目前,我创建了一个JSON对象的每个用户:

jsonObj = { "email" : "[email protected]", 
      "password" : "alex123"} 

,并做了

db.hmset("alex", JSON.stringify(jsonObj)) 

是否有可能嵌入该strucute在另一个结构(用户一个?) 我怎么能设置用户[“alex”]这个结构?

+0

不要你的意思'db.hmset( “用户”, “亚历克斯”,JSON.stringify(jsonObj) )'而不是'db.hmset(“alex”,JSON.stringify(jsonObj))'??? – BMiner 2013-09-24 19:19:21

回答

21

据我所知在Redis中没有本地支持嵌套结构,但它们可以用set + hash(与hierarchical trees相似)来建模。 Hashes可能最适合存储单个JSON对象的字段和值。我会做的是存储与前缀(这是一个Redis的convention)每个用户,例如:

db.hmset("user:alex", JSON.stringify(jsonObj)); 

,然后用sets将用户划分为一组一个叫users关键。然后,我可以通过smembers命令获取所有用户密钥,并分别使用hgetall访问它们中的每一个。

+0

谢谢,这是一个很好的方法。那么,当你需要更新一个特定的用户时,你是否“srem”users“”user:alex“并创建一个新的集合添加到用户? – Luc 2011-04-18 15:00:22

+0

@Luc:如果更新不影响他的名字一个关键字“user:alex”的一部分,那么你不必删除或再次将其添加到集合中,只需更改该哈希中指定的字段并且应该是全部;如果您更改了他的名字,可能需要删除原来的“user:alex”哈希并创建一个新的哈希键,然后从“users”集中删除“user:alex”并添加新创建的哈希键。 – yojimbo87 2011-04-18 15:11:27

+0

我现在使用这种方法并设置),但更新不起作用,只修改检索到的用户对象,似乎我们必须再次“hmset user:alex user” – Luc 2011-04-18 22:21:20

16

您可以将子结构存储为对象,并将其存储在主结构中,而不像指针。因此,考虑到你的榜样,我会做以下

{ 
users : 
    "alex" : { "email" : "[email protected]", 
      "password" : "alex123"}, 
    "sandra" : { "email" : "[email protected]", 
      "password" : "sandra123"}, 
    ... 
} 
$x = incr idx:user 
hmset user:$x email [email protected] password alex123 
sadd list:user $x 

$x = incr idx:user 
hmset user:$x email [email protected] password sandra123 
sadd list:user $x 

希望这可以解决方案可帮助

+0

@劳埃德摩尔,谢谢,是的,事实上我使用这样的东西。 – Luc 2011-04-27 11:56:56

+0

好吧。如果以任何方式提供帮助,请考虑对答案进行投票。开心编程。 – 2011-06-11 13:01:54