PHP 7 MongoDB - 删除所有数据库

时间:2017-10-30 10:15:57

标签: php mongodb

我试图对我的mongodb方法进行单元测试,因此我需要一个tearDown()方法在测试后刷新我的整个mongo数据库。

这是功能:

public function tearDown()
{
    $databases = $this->mongoClient->listDatabases();
    foreach ($databases as $db) {
        $db.dropDatabase();
    }
}

然而,它无法在我的$ db上看到该方法。

Error: Call to undefined function Api\Test\Unit\dropDatabase()

似乎listDatabases()只返回我的dbs的一些信息模型,而不是实际的数据库本身:

/var/www/html/tests/backend/Service/MongoStorageTest.php:35:
class MongoDB\Model\DatabaseInfo#1563 (3) {
  public $name =>
  string(5) "local"
  public $sizeOnDisk =>
  double(83886080)
  public $empty =>
  bool(false)
}

/var/www/html/tests/backend/Service/MongoStorageTest.php:35:
class MongoDB\Model\DatabaseInfo#1483 (3) {
  public $name =>
  string(2) "db"
  public $sizeOnDisk =>
  double(83886080)
  public $empty =>
  bool(false)
}

是否有任何实用或简单的方法可以真正选择它们,或者只使用一种方法删除所有内容?

1 个答案:

答案 0 :(得分:1)

method to drop实际上位于MongoClient,当然getName()

返回的MongoDB\Model\DatabaseInfo类型中有listDatabases()
public function tearDown()
{
    $databases = $this->mongoClient->listDatabases();
    foreach ($databases as $db) {
        $this->mongoClient->dropDatabase($db->getName());
    }
}

或者你可以selectDatabase()并在MongoDB \ Database上使用drop()方法:

public function tearDown()
{
    $databases = $this->mongoClient->listDatabases();
    foreach ($databases as $db) {
        $this->mongoClient->selectDatabase($db->getName())->drop();
    }
}

但在我看来,这更简洁,第一种形式更具表现力。

由于“数据库”是命名空间的基本容器,因此实际上没有“放弃所有内容”的命令。清单和循环列表就是你如何做到的。底线是,如果它不在"command reference",那么就没有这样的东西了。