MongoDB
PHP Manual

MongoDB::command

(PECL mongo >=0.9.2)

MongoDB::commandEjecuta un comando de base de datos

Descripción

public array MongoDB::command ( array $command [, array $options = array() ] )

Prácticamente todo lo que no son operaciones CRUD se puede realizar con un comando de base de datos. ¿Necesita conocer la versión de la base de datos? Hay un comando para ello. ¿Necesita hacer una agregación? Hay un comando para ello. ¿Necesia habilitar la identificación? Ha captado la idea.

Este método es idéntico a:

<?php

public function command($datos) {
    return 
$this->selectCollection('$cmd')->findOne($datos);
}

?>

Parámetros

command

Consulta que se enviará.

options

Este parámetro es un array asociativo de la forma array("nombre_opción" => <boolean>, ...). Actualmente las opciones admitidas son:

  • "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.

Historial de cambios

Versión Descripción
1.2.0 Añadido el parámetro options con una única opción: timeout.

Valores devueltos

Devuelve la respuesta de la base de datos. Cada respuesta de la base de datos siempre es como máximo un documento, lo que significa que el resultado de un comando de base de datos nunca puede exceder 16MB. La estructura del documento resultante depende del comando, pero la mayoría de los resultados tendrán el campo ok para indicar éxito o fracaso, y results, que contiene un array por cada documento resultante.

Ejemplos

Ejemplo #1 Ejemplo de MongoDB::command() con "distinct"

Buscar todos los valores distintos de una clave.

<?php

$personas 
$bd->personas;

$personas->insert(array("nombre" => "Joe""edad" => 4));
$personas->insert(array("nombre" => "Sally""edad" => 22));
$personas->insert(array("nombre" => "Dave""edad" => 22));
$personas->insert(array("nombre" => "Molly""edad" => 87));

$edades $bd->command(array("distinct" => "personas""key" => "edad"));

foreach (
$edades['values'] as $edad) {
    echo 
"$edad\n";
}

?>

El resultado del ejemplo sería algo similar a:


4
22
87

Ejemplo #2 Ejemplo de MongoDB::command() con "distinct"

Buscar todos los valores distintos de una clave, donde el valor es mayor o igual a 18.

<?php

$personas
$bd->personas;

$personas->insert(array("nombre" => "Joe""edad" => 4));
$personas->insert(array("nombre" => "Sally""edad" => 22));
$personas->insert(array("nombre" => "Dave""edad" => 22));
$personas->insert(array("nombre" => "Molly""edad" => 87));

$edades $bd->command(
    array(
        
"distinct" => "personas",
        
"key" => "edad",
        
"query" => array("edad" => array('$gte' => 18))
    )
);  

foreach (
$edades['values'] as $edad) {
    echo 
"$edad\n";
}

?>

El resultado del ejemplo sería algo similar a:


22
87

Ejemplo #3 Ejemplo de MongoDB::command() con MapReduce

Obtener todos los usuarios con al menos un evento "sale" (venta), y cuántas veces han tenido ventas cada uno de esos usuarios.

<?php

// documento de eventos de ejemplo
$eventos->insert(array("user_id" => $id
    
"type" => $tipo
    
"time" => new MongoDate(), 
    
"desc" => $descripción));

// construcción del mapa y función reductora
$mapa = new MongoCode("function() { emit(this.user_id,1); }");
$reductora = new MongoCode("function(k, vals) { ".
    
"var sum = 0;".
    
"for (var i in vals) {".
        
"sum += vals[i];"
    
"}".
    
"return sum; }");

$sales $bd->command(array(
    
"mapreduce" => "events"
    
"map" => $mapa,
    
"reduce" => $reductora,
    
"query" => array("type" => "sale"),
    
"out" => array("merge" => "eventCounts")));

$usuarios $bd->selectCollection($sales['result'])->find();

foreach (
$usuarios as $usuario) {
    echo 
"Usuario {$usuario['_id']} tuvo {$usuario['value']} venta(s).\n";
}

?>

El resultado del ejemplo sería algo similar a:


Usuario 47cc67093475061e3d9536d2 tuvo 3 venta(s).
Usuario 49902cde5162504500b45c2c tuvo 14 venta(s).
Usuario 4af467e4fd543cce7b0ea8e2 tuvo 1 venta(s).

Nota: Usando MongoCode

Este ejemplo utiliza MongoCode, que puede utilizar también un argumento de ámbito. Sin embargo, por el momento, MongoDB no admite el uso de ámbitos en MapReduce. Si deseara utilizar variables en el lado de cliente con las funciones MapReduce, puede añairlas al ámbito global usando el campo opcional de ámbito con el comando de la base de datos. Consulte la » documentación de MapReduce para más información.

Nota: El argumento out

Antes de 1.8.0, el argumento out era opcional. Si no se iba a usar, los resultados de MapReduce se escribían a una colección temporal, que se eliminaba cuando se cerraba la conexión. A partir de la versión 1.8.0, el argumento out es obligatorio. Consulte la » documentación de MapReduce para más información.

Si va a usar MapReduce, Prajwal Tuldhar ha creado una API para usuarios de Mongo PHP que ofrece una interfaz más elegante que el comando básico. Puede descargarlo desde » Github y hay un » artículo de blog sobre cómo usarlo.

Ejemplo #4 Ejemplo de MongoDB::command() con "textSearch"

Realizar una búsqueda de texto completo con la funcionalidad "text search" de MongoDB 2.4 y superior.

<?php
$m 
= new MongoClient();
$d $m->demo;
$c $d->planetas;

$c->insert(array("nombre" => "Mercurio""desc" => "Mercurio es el planeta más pequeño y más cercano al Sol"));
$c->insert(array("nombre" => "Venus""desc" => "Venus es el segundo planeta desde el Sol, su órbita es de 224.7 días terrestres."));
$c->insert(array("nombre" => "Tierra""desc" => "La Tierra es el más denso de los ocho planetas del Sistema Solar."));
$c->insert(array("nombre" => "Marte""desc" => "Marte era el dios romano de la guerra."));

$c->ensureIndex(array('desc' => 'text'));

$r $d->command(array("text" => "planetas"'search' => "sol" ));
print_r($r);
?>

El resultado del ejemplo sería algo similar a:


Array
(
[queryDebugString] => sun||||||
[language] => english
[results] => Array
(
[0] => Array
(
[score] => 0.625
[obj] => Array
(
[_id] => MongoId Object
(
[$id] => 517549d944670a4a5cb3059a
)

[nombre] => Mercurio
[desc] => Mercurio es el planeta más pequeño y más cercano al Sol
)

)

[1] => Array
(
[score] => 0.55
[obj] => Array
(
[_id] => MongoId Object
(
[$id] => 517549d944670a4a5cb3059b
)

[nombre] => Venus
[desc] => Venus es el segundo planeta desde el Sol, su órbita es de 224.7 días terrestres.
)

)

)

[stats] => Array
(
[nscanned] => 2
[nscannedObjects] => 0
[n] => 2
[nfound] => 2
[timeMicros] => 95
)

[ok] => 1
)

Ejemplo #5 Ejemplo de MongoDB::command() con "geoNear"

Este ejemplo muestra cómo usar el comando geoNear.

<?php
$m 
= new MongoClient();
$d $m->demo;
$c $d->poiConcat;

$r $d->command(array(
    
'geoNear' => "poiConcat",      // Buscar en la colección poiConcat
    
'near' => array(-0.0851.48), // Buscar cerca de 51.48°N, 0.08°E
    
'spherical' => true,           // Habilitar la búsqueda esférica
    
'num' => 5,                    // 5 documentos devueltos como máximo
));
print_r($r);
?>

Ver también

La documentación de MongoDB sobre » comandos de base de datos y los comandos individuales: » findAndModify, » getLastError, y » repair (existen muchos más, éstos son sólo unos pocos ejemplos).


MongoDB
PHP Manual