我正在使用 mongodb,并注意到我们应该通过收到此警告来在过滤器查询上使用 not
count()
函数:
@deprecated Use countDocuments or estimatedDocumentCount
http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#count
建议的替代方案
countDocuments()
使用聚合,在某些情况下,这对我们来说会慢 20 倍或更多(从 0.5 秒过滤 10k 文档到 20 秒,这使得响应时间难以忍受)。据称 count()
功能可能不准确,尽管我本人从未亲眼目睹过这种情况。什么情况下会不准确?有一篇文章解释了为什么它首先被弃用吗?与使用聚合的替代方案相比,计数幕后发生了什么值得弃用(countDocuments
)?
作为参考,countDocuments 实现如下所示:
class CountDocumentsOperation extends AggregateOperation {
constructor(collection, query, options) {
const pipeline = [{ $match: query }];
if (typeof options.skip === 'number') {
pipeline.push({ $skip: options.skip });
}
if (typeof options.limit === 'number') {
pipeline.push({ $limit: options.limit });
}
pipeline.push({ $group: { _id: 1, n: { $sum: 1 } } });
super(collection, pipeline, options);
}
如果您有一个分片集群并且块正在从一个分片移动到另一个分片,则可以对它们进行两次计数(导致计数可能是实际值的 2 倍)。
弃用与 MongoDB 4.2 的分片事务工作一起发生,因为无法保证 count 在事务中返回正确的结果。选项是使计数实际计数文档(这很慢)或在事务中禁止它。选择后一个选项,导致 countDocuments 和estimatedDocumentCount 对。
它已被弃用,因为许多人发现它的行为令人惊讶。
本质上,旧的行为是,如果将查询传递给 count,则使用与 countDocuments 相同的行为,否则,使用与estimatedDocumentCount 相同的行为。
如果这明确是您想要的行为,您可以使用这些新函数来实现。
结果不一致:如果在具有分片集群的集合上没有查询谓词,则 count() 可能会返回不准确的计数。这可能会导致误导性的结果,尤其是在数据频繁更改的分布式系统中。
性能开销:在大型集合中,count() 可能会很慢并且占用资源,因为它不会针对特定查询过滤器进行优化,并且可以执行完整的集合扫描。相比之下,countDocuments() 针对过滤计数进行了优化,并且与索引配合良好。
并发和锁定问题:当 count() 用于写入流量较大的集合时,可能会因锁定问题而导致性能瓶颈,因为它可能需要访问整个数据集