php[world] 2019 — 25 years of PHP

MongoDB::command

(PECL mongo >=0.9.2)

MongoDB::commandEjecuta una orden de base de datos

Descripción

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

Prácticamente todo lo que no son operaciones CRUD se puede realizar con una orden de base de datos. ¿Necesita conocer la versión de la base de datos? Hay una orden para ello. ¿Necesita hacer una agregación? Hay una orden 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

La Consulta a enviar.

options

Un array de opciones para la creación del índice. Actualmente las opciones disponibles incluyen:

  • "socketTimeoutMS"

    Esta opción especifica el tiempo límite, en milisegundos, para las comunicaciones con socket. Si el servidor no responde en el periodo especificado, se lanzará una MongoCursorTimeoutException y no habrá forma de determinar si el servidor manejó realmente la escritura o no. Se podría especificar un valor de -1 para bloquear indefinidamente. El valor predeterminado para MongoClient es 30000 (30 segundos).

Las siguientes opciones están obsoletas y no deberían utilizarse más:

  • "timeout"

    Alias obsoleto de "socketTimeoutMS".

hash

Establecer el hash de conexión del servidor que ejecutó la orden. Cuando el resultado de la orden es apropiado para crear un MongoCommandCursor, el objeto del hash es pasarlo a MongoCommandCursor::createFromDocument().

El hash también se corresponderá con una conexión devuelta desde MongoClient::getConnections().

Historial de cambios

Versión Descripción
1.5.0

Se renombró la opción "timeout" a "socketTimeoutMS". Emite un error E_DEPRECATED al utilizar "timeout".

Se añadió el parámetro por referencia hash.

1.2.0 Se añadió 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 una orden de base de datos nunca puede exceder 16 MB. La estructura del documento resultante depende de la orden, 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 de venta ("sale"), y cuántas veces han realizado 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 
"El usuario {$usuario['_id']} realizó {$usuario['value']} venta(s).\n";
}

?>

El resultado del ejemplo sería algo similar a:


El usuario 47cc67093475061e3d9536d2 realizó 3 venta(s).
El usuario 49902cde5162504500b45c2c realizó 14 venta(s).
El usuario 4af467e4fd543cce7b0ea8e2 realizó 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 fuera necesario usar variables en el lado del cliente con las funciones MapReduce, puede añairlas al ámbito global usando el campo opcional de ámbito con la orden 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.

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

Este ejemplo muestra cómo usar la orden 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 » órdenes de base de datos y las órdenes individuales: » findAndModify, » getLastError, y » repair (existen muchas más, éstos son sólo unos pocos ejemplos).

add a note add a note

User Contributed Notes 5 notes

up
4
Min He
9 years ago
rename a collection:

<?php
$m
= new Mongo();
$adminDB = $m->admin; //require admin priviledge

//rename collection 'colA' in db 'yourdbA' to collection 'colB' in another db 'yourdbB'

$res = $adminDB->command(array(
   
"renameCollection" => "yourdbA.colA",
   
"to" => "yourdbB.colB"
));

var_dump($res);
?>
up
3
Anonymous
8 years ago
> Need to know the database version? There's a command for that.

We didn't find it - ended up using either;

<?php
$m
= new Mongo();

$adminDB = $m->admin; //require admin priviledge

$mongodb_info = $adminDB->command(array('buildinfo'=>true));
$mongodb_version = $mongodb_info['version'];

print_r($mongodb_info);
?>

or

<?php
$v
= `mongo --version`;
print_r($v);
?>
up
3
mcuadros at gmail dot com
6 years ago
Command of Mongo 2.4 Text Search feature.

<?php
$result
= $db->command(
    array(
       
'text' => 'bar', //this is the name of the collection where we are searching
       
'search' => 'hotel', //the string to search
       
'limit' => 5, //the number of results, by default is 1000
       
'project' => Array( //the fields to retrieve from db
           
'title' => 1
       
)
    )
);
up
3
roman dot drapeko at gmail dot com
8 years ago
I tried to write MapReduce. Unfortunately, out => array('replace' => 'collName') did not work for me. Instead, the below code works

<?php
$mongo
->command(array(
    
'mapreduce' => 'events',
    
'map' => $map,
    
'reduce' => $reduce,
    
'out' => 'mapReduceEventStats'
));
?>
up
-5
nanhe dot kumar at gmail dot com
5 years ago
$db=new new Mongo();

Copy old_db to new_db

$responseCopy = $db->admin->command(array(
    'copydb' => 1,
    'fromhost' => 'localhost',
    'fromdb' => 'old_db',
    'todb' =>'new_db'
    ));

Now drop old_db

if($responseCopy['ok']==1){
$responseDrop=$db->old_db->command(array('dropDatabase' => 1));
//OR
$responseDrop =$db->old_db->drop();
}

Show Output

print_r($responseCopy);
print_r($responseDrop);

Output will be something like this

Array ( [ok] => 1 )
Array ( [dropped] => old_db [ok] => 1 )
To Top