(PECL mongo >=0.9.2)
MongoDB::command — Ejecuta un comando de base de datos
$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);
}
?>
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.
Versión | Descripción |
---|---|
1.2.0 | Añadido el parámetro options con una única opción: timeout. |
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.
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:
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:
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:
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:
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.08, 51.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);
?>
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).