(PECL mongo >=0.9.2)
MongoDB::command — Выполняет команду базы данных
$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().
Версия | Описание |
---|---|
1.5.0 |
Переименована опция "timeout" в
"socketTimeoutMS". Выдает
Добавлен параметр ссылки на hash. |
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";
}
?>
Результатом выполнения данного примера будет что-то подобное:
Пример #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";
}
?>
Результатом выполнения данного примера будет что-то подобное:
Пример #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";
}
?>
Результатом выполнения данного примера будет что-то подобное:
Замечание: Использование 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.08, 51.48), // Поиск около 51.48° с.ш., 0.08° в.д.
'spherical' => true, // Включение сферический поиск
'num' => 5, // Максимум 5 возвращенных документов
));
print_r($r);
?>
Основная документация MongoDB по » командам базы данных.