MongoDB::command

(PECL mongo >=0.9.2)

MongoDB::commandВыполняет команду базы данных

Описание

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

Почти все, что не является операцией CRUD, может быть выполнено с помощью команды базы данных. Нужно узнать версию базы данных? Для этого есть команда. Нужно сделать агрегацию? Для этого есть команда. Нужно включить запись событий? Вы поняли идею.

Этот метод идентичен:

<?php

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

?>

Список параметров

command

Запрос на отправку.

options

Массив опций для создания индекса. В настоящее время доступны следующие варианты:

  • "socketTimeoutMS"

    Эта опция определяет время в миллисекундах для общения в socket. Если сервер не ответил за отведенное время, то будет брошено исключение MongoCursorTimeoutException, и не будет никакой возможности определить произвел ли сервер запись или нет. Значение -1 используется для постоянно отключения этой функции. Значением по умолчанию для MongoClient является 30000 (30 секунд).

Следующие параметры устарели и больше не должны использоваться:

  • "timeout"

    Устаревший псевдоним для "socketTimeoutMS".

hash

Установите хэш подключения сервера, который выполнил команду. Когда результат команды подходит для создания MongoCommandCursor, хеш предназначен для передачи в MongoCommandCursor::createFromDocument().

Хеш также будет соответствовать соединению, возвращенному из MongoClient::getConnections().

Список изменений

Версия Описание
PECL mongo 1.5.0

Переименована опция "timeout" в "socketTimeoutMS". Выдает E_DEPRECATED при использовании "timeout".

Добавлен параметр ссылки на hash.

PECL mongo 1.2.0 Добавлен параметр options с одним вариантом: "timeout".

Возвращаемые значения

Возвращает ответ базы данных. Каждый ответ базы данных всегда является максимум одним документом, что означает, что результат команды базы данных никогда не может превышать 16 Мб. Структура результирующего документа зависит от команды, но большинство результатов будет иметь поле ok, указывающее успех или неудачу, и results, содержащие массив каждого из результирующих документов.

Примеры

Пример #1 Пример использования MongoDB::command() "distinct"

Поиск всех различных значений для ключа.

<?php

$people 
$db->people;

$people->insert(array("name" => "Joe""age" => 4));
$people->insert(array("name" => "Sally""age" => 22));
$people->insert(array("name" => "Dave""age" => 22));
$people->insert(array("name" => "Molly""age" => 87));

$ages $db->command(array("distinct" => "people""key" => "age"));

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

?>

Результатом выполнения данного примера будет что-то подобное:


4
22
87

Пример #2 Пример использования MongoDB::command() "distinct"

Поиск всех различных значений для ключа, где значение больше или равно 18.

<?php

$people 
$db->people;

$people->insert(array("name" => "Joe""age" => 4));
$people->insert(array("name" => "Sally""age" => 22));
$people->insert(array("name" => "Dave""age" => 22));
$people->insert(array("name" => "Molly""age" => 87));

$ages $db->command(
    array(
        
"distinct" => "people",
        
"key" => "age"
        
"query" => array("age" => array('$gte' => 18))
    )
);  

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

?>

Результатом выполнения данного примера будет что-то подобное:


22
87

Пример #3 Пример использования MongoDB::command() MapReduce

Получение всех пользователей, у которых есть хотя бы одно событие "sale", и сколько раз каждый из этих пользователей совершил распродажу.

<?php

// пример документа о событии
$events->insert(array("user_id" => $id
    
"type" => $type
    
"time" => new MongoDate(), 
    
"desc" => $description));

// конструктор карты и reduce функции
$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 
"{$user['_id']} принял участие в {$user['value']} распродажах.\n";
}

?>

Результатом выполнения данного примера будет что-то подобное:


User 47cc67093475061e3d9536d2 принял участие в 3 распродажах.
User 49902cde5162504500b45c2c принял участие в 14 распродажах.
User 4af467e4fd543cce7b0ea8e2 принял участие в 1 распродажах.

Замечание: Использование MongoCode

В этом примере используется MongoCode, который также может принимать аргумент scope. Однако в настоящее время MongoDB не поддерживает использование scope в MapReduce. Если вы хотите использовать переменные на стороне клиента в функциях MapReduce, вы можете добавить их в глобальную область, используя необязательное поле scope с командой базы данных. Смотрите » документацию MapReduce для получения дополнительной информации.

Замечание: Аргумент out

До 1.8.0 аргумент out был необязательным. Если вы его не используете, результаты MapReduce будут записаны во временную коллекцию, которая будет удалена при закрытии вашего соединения. В 1.8.0+ требуется аргумент out. Смотрите » документацию MapReduce для получения дополнительной информации.

Пример #4 Пример использования MongoDB::command() "geoNear"

В этом примере показано, как использовать команду geoNear.

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

$r $d->command(array(
    
'geoNear' => "poiConcat",      // Поиск в коллекции poiConcat
    
'near' => array(-0.0851.48), // Поиск около 51.48° с.ш., 0.08° в.д.
    
'spherical' => true,           // Включение сферический поиск
    
'num' => 5,                    // Максимум 5 возвращенных документов
));
print_r($r);
?>

Смотрите также

Основная документация MongoDB по » командам базы данных.