【问题标题】:What's the correct way to check if a collection exists?检查集合是否存在的正确方法是什么?
【发布时间】:2019-09-16 20:38:46
【问题描述】:

之前我通过查询命名空间来检查集合是否存在。

大致这样,检查“foo.bar”是否存在:

return 1 === $client->selectCollection('foo','system.namespaces');
                    ->count(['name'=>'bar']);

由于这仅适用于 mmapv1 并且我已移至 wiredTiger,因此我尝试了此操作,而不是依靠驱动程序抛出“数据库 foo 不存在”或“集合栏不存在”。

try {
  $command = new MongoDB\Driver\Command(['listIndexes'=>'bar']);
  $server->executeReadCommand('foo',$command);
  return true;
}
catch( MongoDB\Driver\Exception\CommandException $e ){
  return false;
}

我不想列出集合,因为集合有数千个,但我不喜欢依赖异常,因为我注意到从 3.6 迁移到 4.0 时错误消息发生了变化。

什么是存储引擎不可知论和未来版本证明的正确方法?

【问题讨论】:

    标签: mongodb php-mongodb


    【解决方案1】:

    listCollections 有一个filter 参数,您可以使用它来限制返回的集合。它最终应该看起来有点像db.runCommand({"listCollections": 1, filter: {name: "foo" }});

    【讨论】:

    • 谢谢,看起来很有前途,绝对符合未来的要求。知道这是否在内部使用索引吗?
    • 我不确定。我玩弄了创建 10k 个集合并使用 filter 和不使用查询。没有记录,使用filter,它需要0-1ms,没有它需要大约50ms。这向我表明,在底层它使用的是索引或其他数据结构,可以提供足够好的性能。
    • 感谢您这样做。我正在解决它:) 真的很感激。
    • 我自己试过之后,我同意。以 2 毫秒的速度过滤 17k 集合(迭代所有集合大约需要半秒,因此过滤器似乎很高效)另外值得注意的是,我原来的命名空间查询速度较慢!
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多