我看到estimatedDocumentCount()
在某些情况下可能会得到不一致的结果。另一方面,countDocuments()
永远都是精确的,但它也要花更多钱。
那么,在某些好的用例中,estimatedDocumentCount()
比countDocuments()
更可取?使用时,我们多少性能损失countDocuments()
相对于其他的方法?还有使用estimatedDocumentCount()
的“安全方式”是什么?
我想在多文档交易的情况下比较这两种方法,以便确定使用哪种场景。
答案 0 :(得分:0)
不幸的是,根据用例,“花费更多”可能意味着“数据库中断”。
estimatedDocumentCount()
只是从集合中读取元数据;尽可能接近零成本。另一方面,顾名思义,countDocuments()
实际上是在统计文件。如果您需要的话,那一刻会更准确。
但是,人们必须非常了解{}
的无过滤器(即对countDocuments()
的查询)形式的病理本质。对于大量的文档(例如数十亿个文档),您的第一个线索不是正确的选择,那就是当服务器将自己分页到地面时,数据库集群遇到级联故障。
因此,我认为您的问题是倒退的。就而言,调用estimatedDocumentCount()
本质上是安全,不可能使您的环境陷入困境,但要注意的是您正在那里查看元数据,因此在在某些情况下(分片群集等),可能会有些不准确。但是,实际上,在已部署Mongo的环境中,事情总是会“稍微不准确”。也就是说,无论如何,我此刻所获得的任何计数无论如何从现在开始都可能是不准确的。
相比之下,countDocuments()
的无过滤器本质上是不安全的,并且第一次在巨大的集合上调用它会带来关于O(1)
与O(N)
的强大学习体验