【问题标题】:How to get mongodb collection iterator?如何获取 mongodb 集合迭代器?
【发布时间】:2021-12-14 14:32:01
【问题描述】:

我正在像这样连接到 mongo db:

$mongoClient = new MongoDB\Client($db_string);

像这样获取集合:

$collection = $mongoClient->selectCollection('database_name', 'collection_name');

并像这样获取集合迭代器:

$iterator = $collection->find();

但是最后一次调用会出错:

[错误] 无法从 demo_article 检索源计数:身份验证失败。

我在这里做错了什么?

更新:

这里:

  protected function initializeIterator()
  {
    $this->iterator = $this->collection->find();
    if($this->iterator instanceof Traversable) {
      echo "**Traversable!**";
    }

迭代器是可遍历的。但是,这段代码是从 SourcePluginBase 中调用的:

  protected function doCount() {
    $iterator = $this->getIterator();
    if($iterator instanceof Traversable) {
      echo "**TRAVERSABLE!**";
    }else{
      echo "**NOT TRAVERSABLE!**";
    }

它不是可遍历的?!它怎么会失去可遍历的状态?

【问题讨论】:

  • 并不是说你个人做错了,但这里出了问题 - 根据错误消息 - 是身份验证。您是否考虑过这可能是一个问题?如果是/否,为什么或为什么不?
  • @hakre 我正在编写迁移,因此我的源类需要迭代器。所以想法是连接到数据库,选择集合然后获取它的迭代器。如果是关于身份验证,那么在获取迭代器而不是在第一步时,连接到数据库时会发生什么?

标签: php mongodb iterator


【解决方案1】:

MongoDB\Client 类的文档中所述,构造函数不执行实际连接:

MongoDB\Driver\Manager 是在内部构建的。根据服务器发现和监控规范,MongoDB\Driver\Manager::__construct() 不执行 I/O。连接将在执行第一个操作时按需初始化。

这意味着只有在执行第一个查询时才会打开连接。如果您在连接字符串中未提供凭据,或者它们不正确,那么您会在该查询中收到“身份验证失败”错误。

【讨论】:

  • 我的 $db_string 看起来像:mongodb://root:rootpassword@mongodb:27017/demo (从 php 容器连接到 mongodb 容器) 我能否以某种方式获得有关问题的更详细信息,因此身份验证失败?
  • @MilanG 我猜 root 用户是在 admin 数据库中创建的,而不是 demo,所以你应该用 /admin 而不是 /demo 结束字符串。
  • 我认为管理数据库是系统一,用于存储用户。但我的数据存储在演示数据库中。
  • @MilanG 连接字符串中的数据库仅用于身份验证,没有其他用途(如here所述)。
  • @Oliver,好吧似乎工作。但是现在我有不同的错误: TypeError: Argument 1 passing to iterator_count() must implement interface Traversable, null given in iterator_count() $collection->find() 是获取集合迭代器的正确方法吗?
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 2016-12-24
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2014-08-28
  • 2021-07-05
相关资源
最近更新 更多