2011-04-18 22 views
26

estoy usando node_redis y me gustaría guardar una estructura como:Guardar resumen anidada en Redis través de una aplicación Node.js

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

Actualmente, para cada usuario se crea un objeto JSON:

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

y hacer un

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

¿es posible esta incrustado strucute en otra estructura (los usuarios de uno?) ¿Cómo podría configurar usuarios ["alex"] con esta estructura?

+0

No quiere decir 'db.hmset ("usuarios", "Alex", JSON.stringify (jsonObj)) 'en lugar de' db.hmset ("alex", JSON.stringify (jsonObj)) '??? – BMiner

Respuesta

21

Hasta donde yo sé, no hay soporte nativo para estructuras anidadas en Redis, pero se pueden modelar, por ejemplo, con set + hash (similar a hierarchical trees). Hashes son probablemente los más adecuados para almacenar campos y valores de un solo objeto JSON. Lo que quiero hacer es almacenar cada usuario con un prefijo (que es un Redis convention), por ejemplo:

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

y luego usar sets agrupar a los usuarios en un conjunto con una clave denominada users. Luego puedo obtener todas las claves de los usuarios mediante el comando smembers y acceder a cada una de ellas individualmente con hgetall.

+0

gracias, este es un buen enfoque. Luego, cuando necesita actualizar un usuario en particular, ¿"srem" usuarios "" usuario: alex "y crea un nuevo conjunto para agregar a los usuarios? – Luc

+0

@Luc: si la actualización no afecta su nombre que se utiliza como una parte de la clave "usuario: alex", entonces no tiene que quitarlo o agregarlo nuevamente al conjunto. Simplemente cambia los campos especificados en ese hash y eso debería ser todo. En caso de que también esté cambiando su nombre, probablemente tendría que eliminar el hash original "user: alex" y crear uno nuevo. Luego eliminaría "user: alex" del conjunto "users" y agregaría allí la nueva clave hash. – yojimbo87

+0

Ahora uso este enfoque (mix of Hash) y Set). Pero la actualización no funciona solo modificando el objeto del usuario recuperado. Parece que tenemos que "hmset user: alex user" una vez más. – Luc

16

Puede almacenar la subestructura como un objeto y almacenarla en la estructura principal, como un puntero. Por lo tanto, dada su ejemplo, me gustaría hacer lo siguiente

{ 
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 

Esperanza esta posible solución ayuda a

+0

@ lloyd-moore, gracias, sí, de hecho, uso algo como esto. – Luc

+0

bien bien. por favor, considere un voto para la respuesta si ayudó de alguna manera. feliz programacion –

Cuestiones relacionadas