versión corta:consulta MongoDB utilizando el documento incrustado como clave
Si tengo un índice {"category": 1}
, y un documento {"category": {type: "memory", class: "DDR400"}
, ¿cómo puedo hacer una consulta como {"category.type": "memory"}
que utiliza mi índice?
Versión larga:
Con MongoDB, quiero usar un documento incrustado como una clave para un índice.
Por ejemplo, podría haber algunos documentos como este (para una hipotética base de datos del producto):
{"category": {"type": "hard-drive", "form_factor": "2.5in", "size": "500GB"}, ...}
{"category": {"type": "hard-drive", "form_factor": "3.5in", ...}, ...}
{"category": {"type": "memory", "class": "DDR400", ...}, ...}
Para los ejemplos anteriores, puede ser que desee hacer preguntas tales como:
{"category.type": "hard-drive"}
{"category.type": "hard-drive", "category.form_factor": "2.5in"}
{"category.type": "memory"}
{"category.type": "memory", "category.class": "DDR400"}
Mis problemas es crear un índice. El documento en http://www.mongodb.org/display/DOCS/Indexes#Indexes-DocumentsasKeys describe dos opciones:
La primera opción es crear un índice compuesto, por ejemplo { "category.type": 1, "category.class": 1 }
. Esto no funciona bien para mi caso, ya que podría tener muchos tipos diferentes de subcategorías.
La segunda opción es utilizar el documento como la clave: { "category": 1 }
. Ahora una consulta como {"category": {"type": "memory", "class": "DDR400"}}
usaría el índice, pero {"category": {"type": "memory"}}
no devolvería nada, y {"category.type": "memory"}
no usaría el índice. ¿Hay alguna manera de hacer una consulta usando este índice que daría los mismos resultados que {"category.type": "memory"}
?
Sospecho que una consulta usando algo como {"category" {"$gt": ..., "$lt": ...}
debería funcionar, pero ¿qué debería poner en los espacios en blanco?
Mi problema es que, posiblemente, podría tener muchas llaves diferentes dentro de la categoría, y no puedo crear un índice en cada uno de ellos. Siempre consultaba las teclas en el documento incrustado de izquierda a derecha (así que nunca solo las últimas claves). – Ralf
Su solución con $ gt y $ lt parece funcionar, pero ¿en qué casos podría fallar? – Ralf
Solo necesita crear índices en las teclas que va a consultar. Preguntar "en las teclas de izquierda a derecha" probablemente tampoco funcione demasiado bien si puede haber muchas combinaciones. Considere {a: 1, b: 1, c: 1} frente a {a: 1, c: 1} frente a {b: 1, c: 1}. No puede consultar todas las combinaciones de a, b, c con estos documentos. – Thilo