2011-03-15 13 views
10

Leí en alguna parte que llamar al ensureIndex() realmente crea una colección si no existe. Pero el índice siempre está en algunos campos, no en todos, de modo que si aseguro un índice en { name:1 } y luego agrego documentos a esa colección que tienen muchos más campos, ¿funcionará el índice? Sé que no tenemos un esquema, proveniente del mundo RDBMS, solo quiero asegurarme. :) Me gustaría crear índices cuando se inicie mi sitio web, pero inicialmente la base de datos está vacía. No necesito tener ningún dato antes de asegurar los índices, ¿es correcto?¿Está bien llamar a ensureIndex en colecciones no existentes?

Respuesta

9

ensureIndex creará la colección si aún no existe. No importa si agrega documentos que no tienen la propiedad que cubre el índice, simplemente no puede usar ese índice para encontrar esos documentos. La forma en que lo entiendo es que en las versiones anteriores a 1.7.4, un documento al que le falta una propiedad para la que hay un índice se indexará como si tuviera esa propiedad, pero tendrá un valor nulo. En las versiones posteriores a la 1.7.4, puede crear índices dispersos que no incluyen estos objetos. La diferencia es leve pero puede ser significativa en algunas situaciones.

Dependiendo de las circunstancias, puede no ser una buena idea crear índices cuando se inicia la aplicación. Considere la situación en la que implementa una nueva versión que agrega nuevos índices cuando se inicia, en desarrollo no se dará cuenta ya que solo tiene una base de datos pequeña, pero en producción puede tener una gran base de datos y agregar el índice llevará mucho de tiempo. Durante la creación del índice, su aplicación se bloqueará y no podrá atender solicitudes. Puede crear índices con el indicador de fondo establecido en verdadero (la sintaxis depende del controlador que esté usando), pero en la mayoría de los casos es mejor agregar índices manualmente o como parte de un script de configuración. De esa manera, tendrá que pensar antes de actualizar los índices.

+0

Estoy usando ASP.NET MVC y el controlador oficial C# específicamente, pero creo que la pregunta es independiente de la tecnología. Sin embargo, no he pensado poner las llamadas de indexación en mi script de compilación, lo que suena interesante, necesito averiguar cómo llamar a 'ensureIndex' desde la línea de comandos. –

+0

Creo que debería ser posible llamar a 'ensureIndex' desde un script JS cargado a través del shell mongo. –

+0

Puede ejecutar un archivo JavaScript con 'mongo db_name script.js'. Ese archivo puede contener la mayoría de las cosas que puede escribir en la consola de Mongo. – Theo

Cuestiones relacionadas