MongoCollection
PHP Manual

MongoCollection::ensureIndex

(PECL mongo >=0.9.0)

MongoCollection::ensureIndex Crea un índice en el/los campo/s dado/s, o si el índice ya existe, no realiza nada

Descripción

public bool MongoCollection::ensureIndex ( string|array $key|keys [, array $options = array() ] )

Este método crea un índice en la colección y los campos especificados. Al especificar la clave se puede o bien proporcionar un nombre de campo en forma de string, o un array que contenga uno o más nombres de campo con su sentido de ordenación.

Parámetros

keys

Array que contiene los campos por los que se ordenará el índice. Cada elemento del array tiene como clave el nombre del campo, y como valor, o bien 1 para orden ascendente, o bien -1 para orden desendente.

options

Este parámetro es un array asociativo de la forma array("nombredeopcion" => <boolean>, ...). Las opciones soportadas actualmente son:

  • "w"

    Véase WriteConcerns. El valor predeterminado de MongoClient es 1.

  • "unique"

    Crea un índice único.

    Advertencia

    No se puede crear un índice único en un campo si los distintos documentos existentes no contienen dicho campo. Este es efectivamente NULL para estos documentos y, por lo tanto, ya es no único. Se podría utilizar indexación fluida para superar este problema, ya que prevendrá que los documentos sin dicho cambo sean indexados.

  • "dropDups"

    Si se estuviera creando un índice único, y existieran valores duplicados, borrar todos excepto uno de ellos.

  • "sparse"

    Crea un índice fluido, el cual únicamente incluye documentos que contiene el campo. Esta opción solamente es compatible con índices de campo sencillo.

  • "expireAfterSeconds"

    El valor de esta opciión debería especificar el número de segundos transcurridos para que un documento sea considerado como expirado y sea automáticamente eliminado de la colección. Esta opción solamente es compatible con índices de campo sencillo donde el campo contiene valores MongoDate.

    Esta característica está disponible en MongoDB 2.2+. Véase » Expirar datos de colecciones estableciendo el TTL para más información.

  • "background"

    De manera predeterminada, la creación de un índice es una operación de bloqueo que detendrá otras operaciones sobre la base de datos hasta que sea completada. Si se especifica TRUE para esta opción, el índice se creará en segundo plano mientras toman lugar otras operaciones.

    Advertencia

    Antes de MongoDB 2.1.0, la operación de construcción de un índice no estaba en segundo plano cuando replicaba a secundarios, sin tener en cuenta esta opción. See » Building Indexes with Replica Sets for more information.

  • "name"

    Esta opción permite sobrescribir el algoritmo que usa el controlador para crear un nombre de índice y especificar el propio. Puede ser útil si se están indexando varias claves y Mongo reclama que el nombre del índice es muy extenso.

  • "timeout"

    Entero, valor predeterminado MongoCursor::$timeout. Si se usan las escrituras reconocidas, esto estable cuánto debe esperar el cliente (en milisegundos) a una respuesta de la base de datos. Si la base de datos no responde dentro de perído de espera, se lanzará una MongoCursorTimeoutException.

  • "safe"

    Obsoleto. Use la opción w de WriteConcern.

Valores devueltos

Devuelve un array que contiene el estado de la creación del índice si la opción "w" está establecida. De lo contrario, devuelve TRUE.

Los campos del array de estado están descritos en la documentación de MongoCollection::insert().

Historial de cambios

Versión Descripción
1.3.0 El parámetro options ya no acepta un booleano para identificar un índice único. En su lugar, ahora debe hacerse con array('unique' => true).
1.2.11 Emite un error de nivel E_DEPRECATED cuando options es de tipo scalar.
1.2.0 Se añadió la opción "timeout".
1.0.11

La opción "safe" desencadenará una tolerancia a fallos en el primario, si fuera necesario.

Se lanzará una MongoException si el nombre del índice (generado o establecido) es mayor que 128 bytes.

1.0.5 Se añadió la opción "name" para sobrescribir la creación del nombre del índice.
1.0.2 Cambiado el parámetro options de booleano a array. Antes de la versión 1.0.2, el segundo parámetro era un valor booleano opcional que especificaba si era o no un índice único.

Errores/Excepciones

Lanza MongoException si el nombre de índice es superior a 128 bytes. (Versión 1.0.11+)

Lanza una MongoCursorException si la opción "w" está establecida y la escritura falla.

Lanza una MongoCursorTimeoutException si la opción "w" está establecida a un valor mayor que uno y la operación toma más de MongoCursor::$timeout milisegundos en completarse. Esto no pondrá fin a la operación en el servidor, es un tiempo de espera del lado del cliente. La operación en MongoCollection::$wtimeout es milisegundos.

Ejemplos

Ejemplo #1 Ejemplo de MongoCollection::ensureIndex()

<?php

$c 
= new MongoCollection($db'foo');

// crea un índice en 'x' ascendente
$c->ensureIndex('x');

// crea un índice en 'y' ascendente
$c->ensureIndex(array('y' => 1));

// crea un índice en 'z' ascendente y en 'zz' descendente
$c->ensureIndex(array('z' => 1'zz' => -1));

// crea un índice único en 'x'
$c->ensureIndex(array('x' => 1), array("unique" => true));

?>

Ejemplo #2 Ejemplo de borrado de duplicados

<?php

$collection
->insert(array("username" => "joeschmoe"));
$collection->insert(array("username" => "joeschmoe"));

/*
 * falla la creación del índice; no se puede crear un índice único en una clave que no tiene
 * valores únicos
 */
$collection->ensureIndex(array("username" => 1), array("unique" => 1));

/*
 * éxito al crear índice: se ha eliminado uno de los documentos de la colección
 */
$collection->ensureIndex(array("username" => 1), array("unique" => 1"dropDups" => 1));

/* 
 * ahora tenemos un índice único, por lo que las inserciones con el mismo username (como el
 * anterior) fallarán
 */
$collection->insert(array("username" => "joeschmoe"));

?>

Ejemplo #3 Indexación Geoespacial

Mongo soporta índices geoespaciales, que permiten buscar documentos cercanos a una determinada localización o que estén dentro de una determinada forma. Por ejemplo, para crear un índice geoespacial en el campo "loc":

<?php

$collection
->ensureIndex(array("loc" => "2d"));

?>

Ver también

Documentación de MongoDB sobre » índices por defecto y sobre » índices geoespaciales.


MongoCollection
PHP Manual