(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 registros de mensajes? Se puede hacer una idea.
Este método es equivalente a:
<?php
public function command($data) {
return $this->selectCollection('$cmd')->findOne($data);
}
?>
command
Consulta que se enviará.
options
Este parámetro es un array asociativo de la forma array("nombre_opción" => <boolean>, ...). Actualmente las opciones soportadas son:
"timeout"
Entero, su valor predeterminado es MongoCursor::$timeout. Si se establece a "safe", establece cuánto espera el cliente (en milisegundos) a un respuesta de la base de datos. Si la base de datos no responde dentro del periodo del tiempo de espera, será lanzada 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.
Ejemplo #1 Ejemplo de MongoDB::command() con "distinct"
Localizando todos los valores distintos de una clave.
<?php
$personas = $db->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 = $db->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= $db->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 = $db->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
$events->insert(array("user_id" => $id,
"type" => $type,
"time" => new MongoDate(),
"desc" => $description));
// construcción del mapa y función reductora
$map = new MongoCode("function() { emit(this.user_id,1); }");
$reduce = new MongoCode("function(k, vals) { ".
"var sum = 0;".
"for (var i in vals) {".
"sum += vals[i];".
"}".
"return sum; }");
$sales = $db->command(array(
"mapreduce" => "events",
"map" => $map,
"reduce" => $reduce,
"query" => array("type" => "sale"),
"out" => array("merge" => "eventCounts")));
$users = $db->selectCollection($sales['result'])->find();
foreach ($users as $user) {
echo "Usuario {$user['_id']} tuvo {$user['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 soporta 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 cerrara 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 'al desnudo'. Puede descarlo desde » Github y hay un » artículo de blog sobre cómo usarlo.
Documentación de MongoDB sobre » comandos de base de datos y comando individuales: » findAndModify, » getLastError, y » repair (existen muchos más, éstos son sólo unos pocos ejemplos).