2011-04-18 180 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