2024年PHP日本大会

MongoDB\Driver\Command 类

(mongodb >=1.0.0)

简介

MongoDB\Driver\Command 类是一个值对象,它表示数据库命令。

为了提供命令助手,应该组合MongoDB\Driver\Command 对象。

类概要

final class MongoDB\Driver\Command {
/* 方法 */
final public __construct(array|object $document, ?array $commandOptions = null)
}

示例

示例 #1 组合MongoDB\Driver\Command 来提供一个创建集合的助手

<?php
class CreateCollection {
protected
$cmd = array();

function
__construct($collectionName) {
$this->cmd["create"] = (string) $collectionName;
}
function
setCappedCollection($maxBytes, $maxDocuments = false) {
$this->cmd["capped"] = true;
$this->cmd["size"] = (int) $maxBytes;

if (
$maxDocuments) {
$this->cmd["max"] = (int) $maxDocuments;
}
}
function
usePowerOf2Sizes($bool) {
if (
$bool) {
$this->cmd["flags"] = 1;
} else {
$this->cmd["flags"] = 0;
}
}
function
setFlags($flags) {
$this->cmd["flags"] = (int) $flags;
}
function
getCommand() {
return new
MongoDB\Driver\Command($this->cmd);
}
function
getCollectionName() {
return
$this->cmd["create"];
}
}


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

$createCollection = new CreateCollection("cappedCollection");
$createCollection->setCappedCollection(64 * 1024);

try {
$command = $createCollection->getCommand();
$cursor = $manager->executeCommand("databaseName", $command);
$response = $cursor->toArray()[0];
var_dump($response);

$collstats = ["collstats" => $createCollection->getCollectionName()];
$cursor = $manager->executeCommand("databaseName", new MongoDB\Driver\Command($collstats));
$response = $cursor->toArray()[0];
var_dump($response);
} catch(
MongoDB\Driver\Exception $e) {
echo
$e->getMessage(), "\n";
exit;
}

?>

以上示例将输出

object(MongoDB\Driver\Command)#3 (1) {
  ["command"]=>
  array(3) {
    ["create"]=>
    string(16) "cappedCollection"
    ["capped"]=>
    bool(true)
    ["size"]=>
    int(65536)
  }
}
array(1) {
  ["ok"]=>
  float(1)
}
array(16) {
  ["ns"]=>
  string(29) "databaseName.cappedCollection"
  ["count"]=>
  int(0)
  ["size"]=>
  int(0)
  ["numExtents"]=>
  int(1)
  ["storageSize"]=>
  int(65536)
  ["nindexes"]=>
  int(1)
  ["lastExtentSize"]=>
  float(65536)
  ["paddingFactor"]=>
  float(1)
  ["paddingFactorNote"]=>
  string(101) "paddingFactor is unused and unmaintained in 2.8. It remains hard coded to 1.0 for compatibility only."
  ["userFlags"]=>
  int(0)
  ["capped"]=>
  bool(true)
  ["max"]=>
  int(9223372036854775807)
  ["maxSize"]=>
  int(65536)
  ["totalIndexSize"]=>
  int(8176)
  ["indexSizes"]=>
  object(stdClass)#4 (1) {
    ["_id_"]=>
    int(8176)
  }
  ["ok"]=>
  float(1)
}

目录

添加笔记

用户贡献笔记 2 条笔记

tdrpic
8年前
如果您想知道如何执行“distinct”查询

<?php

// MongoDB示例命令:
// db.product.distinct("scent", {"prodCat": "10 oz can"})

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

$query = ['prodCat' => '10 oz can']; // 标准MongoDB查询
$cmd = new MongoDB\Driver\Command([
// 构造'distinct'命令
'distinct' => 'product', // 指定集合名称
'key' => 'scent', // 指定要获取唯一值的字段
'query' => $query // 筛选文档的条件
]);
$cursor = $manager->executeCommand('catalog', $cmd); // 获取结果
$scents = current($cursor->toArray())->values; // 将唯一值作为数组获取

var_dump($scents);

?>
jonny dot b dot 112 at gmail dot com
6年前
0) 阅读官方MongoDB文档,了解您可以使用的数据库命令以及它们所需的参数 - https://docs.mongodb.com/manual/reference/command/

1) 错误
$cmd = new \MongoDB\Driver\Command([
'aggregate' => 'collection',
'pipeline' => ['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]]
]);
因为pipeline在JSON中是对象的数组(在PHP中是关联数组的索引数组)- pipeline: [ {<stage>}, ... ]
这是什么意思?这意味着'pipeline'必须像这样:
[
['$group' => ['_id' => null, 'count' => ['$sum' => '$total']]], // 这是 {<stage>}
['$match' => [...]], // 还有这个
...
[...] // 以及所有这些
]
请参考 https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/

2) `__construct` 参数 `$document` 的关联数组中的第一对(如果它是数组)必须是命令名称(例如 `'count' => 'collectionName'` 或 `'findAndModify' => 'collectionName'`)。我通过实验发现了这一点,但是您可以检查源代码 https://github.com/mongodb/mongo-php-driver/blob/master/src/MongoDB/Command.c 来了解原因。
To Top