PHPCon Poland 2024

MongoDB\Driver\Manager::executeQuery

(mongodb >=1.0.0)

MongoDB\Driver\Manager::executeQueryВыполняет запрос к базе данных

Описание

final public MongoDB\Driver\Manager::executeQuery(string $namespace, MongoDB\Driver\Query $query, array|MongoDB\Driver\ReadPreference|null $options = null): MongoDB\Driver\Cursor

Метод выбирает сервер в соответствии с опцией readPreference и выполняет запрос на этом сервере.

Значения по умолчанию для параметра "readPreference" и параметра "readConcern" Query-запроса будут выведены из активной транзакции (обозначенной параметром session), за которой следует URI-идентификатор соединения.

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

namespace (string)

Полностью определённое имя (т.е. "databaseName.collectionName").

query (MongoDB\Driver\Query)

Запрос для выполнения.

options

options
Опция Тип Описание
readPreference MongoDB\Driver\ReadPreference

Предпочтение чтения, используемая для выбора сервера для выполнения операции.

session MongoDB\Driver\Session

Сессия для связывания с операцией.

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

В случае успешного выполнения метод возвращает курсор MongoDB\Driver\Cursor.

Ошибки

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

Версия Описание
PECL mongodb 1.4.0 Третий параметр теперь — массив параметров options. В целях обратной совместимости этот параметр по-прежнему будет принимать объект MongoDB\Driver\ReadPreference.

Примеры

Пример #1 Пример использования метода MongoDB\Driver\Manager::executeQuery()

<?php

$manager
= new MongoDB\Driver\Manager("mongodb://localhost:27017");

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1]);
$bulk->insert(['x' => 2]);
$bulk->insert(['x' => 3]);
$manager->executeBulkWrite('db.collection', $bulk);

$filter = ['x' => ['$gt' => 1]];
$options = [
'projection' => ['_id' => 0],
'sort' => ['x' => -1],
];

$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('db.collection', $query);

foreach (
$cursor as $document) {
var_dump($document);
}

?>

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

object(stdClass)#6 (1) {
  ["x"]=>
  int(3)
}
object(stdClass)#7 (1) {
  ["x"]=>
  int(2)
}

Пример #2 Ограничение времени выполнения запроса

Опция maxTimeMS класса MongoDB\Driver\Query может использоваться для ограничения времени выполнения запроса. Обратите внимание, что этот срок применяется на стороне сервера и не учитывает задержки сети. Дополнительную информацию даёт страница » Завершение выполнения операций руководства СУБД MongoDB.

<?php

$manager
= new MongoDB\Driver\Manager('mongodb://localhost:27017');

$filter = ['x' => ['$gt' => 1]];
$options = [
'maxTimeMS' => 1000,
];

$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('db.collection', $query);

foreach (
$cursor as $document) {
var_dump($document);
}

?>

Если запрос не завершится через секунду после начала выполнения на сервере, метод выбросит исключение MongoDB\Driver\Exception\ExecutionTimeoutException.

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

add a note

User Contributed Notes 1 note

up
-36
Anonymous
7 years ago
$filter = [];
if (!empty($mail_brand)) {
$filter['mx.brand_id'] = intval($mail_brand);
}
if (!empty($contacttool_brand)) {
$filter['contacttool.brand_id'] = intval($contacttool_brand);
}
if ($mx_switch_title == 20 || empty($province)) {
$filter["wwwtitle"] = ['$ne' => null];
}
//网站标题
if (!empty($wwwtitle)) {
$filter['wwwtitle'] = new \MongoDB\BSON\Regex(".*{$wwwtitle}.*", '');
}
//只带mx的查询
if ($mx_on_switch == 20 || empty($province)) {
$filter["mx"] = ['$exists' => true];
}
//mx模糊查询
if (!empty($mx_vague_check)) {
$filter["mx.mx"] = new \MongoDB\BSON\Regex(".*{$mx_vague_check}.*", '');
}

//如果没有传递省份
if (empty($province)) {
$province = "shandong";
}
try {
$options_base = ['connectTimeoutMS' => 500000, 'socketTimeoutMS' => 500000];
$manager = new \MongoDB\Driver\Manager(C('mongodb_auth_url'), $options_base);
// $readPreference = $manager->getReadPreference();
// $server = $manager->selectServer($readPreference);
$coll = C('default_db') . '.' . $province;
$options = [
"skip" => $page,
"limit" => $rows,
'projection' => ['createdate' => 0,
'expiresdate' => 0,
'registrant_city' => 0,
'registrant_street' => 0,
'registrant_state' => 0,
'updatedate' => 0,
'whoisserver_id' => 0,
'registrar_name_id' => 0,
'id' => 0,
],
];
//查询记录总的数量
$commands = [
'count' => $province,
'query' => $filter
];
$command = new \MongoDB\Driver\Command($commands);
$cursor = $manager->executeCommand('mxmanage', $command);
$info = $cursor->toArray();
$count = $info[0]->n;
$query = new \MongoDB\Driver\Query($filter, $options);
$rows = $manager->executeQuery($coll, $query);
$info = [];
foreach ($rows as $document) {
$doc = (array)$document;
$doc['_id'] = (string)$doc['_id'];
$doc['mail_brand_name'] = $doc['mx']->brand_name;
$doc['mail_mx'] = $doc['mx']->mx ?: '';
$doc['contacttool_brand_name'] = $doc['contacttool']->brand_name;
$doc['mx_changetime'] = !$doc['mx_changetime'] ? '' : date('Y-m-d H:i', $doc['mx_changetime']);
$doc['contacttool_changetime'] = !$doc['contacttool_changetime'] ? '' : date('Y-m-d H:i', $doc['contacttool_changetime']);
unset($doc['mx']);
unset($doc['contacttool']);
$info[] = $doc;
}
} catch (\MongoDB\Driver\Exception $e) {
echo $e->getMessage(), "\n";
exit;
}
To Top