【问题标题】:PHP 7 MongoDB - drop all databasesPHP 7 MongoDB - 删除所有数据库
【发布时间】:2017-10-30 10:15:57
【问题描述】:

我正在尝试对我的 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() 只返回我的数据库的一些信息模型,而不是实际的数据库本身:

/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)
}

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

【问题讨论】:

  • $db.dropDatabase(); - PHP 不使用 .要访问方法,这是有效的:$db->dropDatabase(); 给定的 dropDatabase 方法确实存在
  • 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,那么请对答案发表评论,以澄清究竟需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题

标签: php mongodb


【解决方案1】:

method to drop 实际上是在MongoClient 上,当然还有来自MongoDB\Model\DatabaseInfo 类型的getName()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" 中,那么就没有这样的东西。

【讨论】:

  • 我没有使用 MongoClient,PHP 手册说它是 deprecated。我在 MongoDB/Client 库中。
  • @MattSom 文档链接来自 PHPLIB 驱动程序的答案。当您实际查看它们时,会清楚地显示出来。不是您指向的驱动程序。阅读链接中的文档。
  • 我承认我已经失去了你,我只是说 MongoClient 解决方案对我不利。尽管如此, getName() 逻辑是我正在寻找的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
相关资源
最近更新 更多