2012-09-09 17 views
6

Digamos que deseo mantener una lista de elementos por usuario (en MongoDB con Mongoose ODM en el entorno Node.js) y luego consultar para ver si un elemento es propiedad de un usuario. Por ejemplo, quiero almacenar todos los colores favoritos de cada usuario y luego ver si un color específico es propiedad de un usuario específico. Me parece que sería mejor almacenar los colores como un objeto incrustado dentro del documento del usuario, en lugar de una matriz dentro del documento del usuario. La razón es que parece más eficiente que comprobar para ver si existe un color de un objeto tan sólo puedo comprobar para ver si existe la propiedad del objeto:Matrices MongoDB contra objetos

if(user.colors.yellow){ 
    //true case 
} else { 
    //false case 
} 

Versus una matriz en donde tengo que recorrer a través de la toda matriz para ver si existe el color en algún lugar de la matriz:

for (var i = 0; i < user.colors.length; i++) { 
    if(user.colors[i] === "yellow"){ 
    //true case 
    } else { 
    //false case 
    } 
} 

Sin embargo, en muchos de los ejemplos que he visto en línea, parece que la utilización de matrices para este tipo de cosas es bastante frecuente. ¿Me estoy perdiendo de algo? ¿Cuáles son los pros/contras, y la mejor manera de hacer esto?

+1

¿Puede proporcionar algún vínculo a tales consejos? – c69

Respuesta

2

No es necesario utilizar un bucle for si los colores se almacenan como una matriz. Usted sólo puede usar indexOf, como en:

if(user.colors.indexOf("yellow") != -1){ 
    //true case 
} 

Dicho esto, lo que realmente no debería importar cualquier manera si se utiliza un documento o una matriz incrustada; no es como si uno u otro dieran una gran ventaja de rendimiento.

+0

'no es como si uno u otro fuera a dar una gran ventaja de rendimiento'. ¡¿Es eso cierto?! Y si es así, a qué escala. Si solo hay 8 colores, será insignificante, una vez. Pero ¿qué pasa con muchos colores, o se accede en un bucle muchas veces? –

1

Con frecuencia ve arreglos incrustados utilizados para almacenar este tipo de información en las colecciones de MongoDB porque si agrega un índice a la propiedad de la matriz, son eficientes de consultar y usan una sintaxis natural. En este caso algo como lo siguiente (suponiendo una colección de usuarios que contiene una propiedad de matriz de colores):

db.users.find({id: 1, colors: 'yellow'}) 

Si hizo esto con propiedades de color individual que tendríamos una consulta buscando más difíciles como este y que le tiene que indexar por separado cada color (en lugar de solo colors como lo haría anteriormente):

db.users.find({id: 1, 'colors.yellow': true}) 
Cuestiones relacionadas