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" 选项和 Query 的 "readConcern" 选项的默认值将从活动事务(由 "session" 选项指示)推断,然后从 连接 URI 推断。

参数

namespace (string)

完全限定的命名空间(例如 "databaseName.collectionName")。

query (MongoDB\Driver\Query)

要执行的查询。

选项

选项
选项 类型 说明
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

添加注释

用户贡献注释 1 个注释

-37
匿名
7 年前
$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