为什么 mongodb 集合计数被弃用?

问题描述 投票:0回答:3

我正在使用 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);
  }
mongodb count node-mongodb-native
3个回答
4
投票

如果您有一个分片集群并且块正在从一个分片移动到另一个分片,则可以对它们进行两次计数(导致计数可能是实际值的 2 倍)。

弃用与 MongoDB 4.2 的分片事务工作一起发生,因为无法保证 count 在事务中返回正确的结果。选项是使计数实际计数文档(这很慢)或在事务中禁止它。选择后一个选项,导致 countDocuments 和estimatedDocumentCount 对。


3
投票

它已被弃用,因为许多人发现它的行为令人惊讶。

本质上,旧的行为是,如果将查询传递给 count,则使用与 countDocuments 相同的行为,否则,使用与estimatedDocumentCount 相同的行为。

如果这明确是您想要的行为,您可以使用这些新函数来实现。


0
投票
  1. 结果不一致
  2. 性能开销
  3. 并发和锁定问题
  • 结果不一致:如果在具有分片集群的集合上没有查询谓词,则 count() 可能会返回不准确的计数。这可能会导致误导性的结果,尤其是在数据频繁更改的分布式系统中。

  • 性能开销:在大型集合中,count() 可能会很慢并且占用资源,因为它不会针对特定查询过滤器进行优化,并且可以执行完整的集合扫描。相比之下,countDocuments() 针对过滤计数进行了优化,并且与索引配合良好。

  • 并发和锁定问题:当 count() 用于写入流量较大的集合时,可能会因锁定问题而导致性能瓶颈,因为它可能需要访问整个数据集

© www.soinside.com 2019 - 2024. All rights reserved.