【问题标题】:Mongodb returning wrong countMongodb返回错误的计数
【发布时间】:2020-02-15 09:37:53
【问题描述】:

我从一个几 GB 的数据文件流式传输数据并导入到 Mongo 集合中。该文件已压缩,所以我做了zcat file.gz | mongoimport 我知道我应该在集合中有 454229 个文档。它是空的,文件有 454229 条记录。过程结束后,我试了一次,得到了459680。我清空了集合,重复了这个过程。结果相同。然后我在“_id”列上尝试了 distinct,尝试了 length,得到了 454229。为了确保没有其他进程正在更改数据,我尝试了 count 和 distinct 两次,distinct 后跟 count,然后 count 后跟 distinct。

rs1:PRIMARY> db.amazon_xml_data.distinct("_id").length;
454229
rs1:PRIMARY> db.amazon_xml_data.count({});
459680
rs1:PRIMARY> db.amazon_xml_data.count({});
459680
rs1:PRIMARY> db.amazon_xml_data.distinct("_id").length;
454229

Mongo 版本是 3.2.22。我在日志文件的末尾也有这个文本......

amazon_xml_data 1.11GB
2020-02-15T14:37:07.302+0530    imported 454229 documents    

所以我几乎可以肯定count返回的数字是错误的。

【问题讨论】:

    标签: mongodb count distinct


    【解决方案1】:

    在 2 种情况下,count 可能不准确:

    在使用 Wired Tiger 存储引擎非正常关闭 mongod 后,count 报告的计数统计信息可能不准确。 在 mongod 上的每个集合上运行 validate 以在不正常关闭后恢复正确的统计信息。

    https://docs.mongodb.com/v3.2/reference/command/count/#accuracy-after-unexpected-shutdown

    在分片集群上,如果存在孤立文档或正在进行块迁移,db.collection.count() 可能会导致不准确计数。

    https://docs.mongodb.com/v3.2/reference/method/db.collection.count/#sharded-clusters

    使用更好:

    db.amazon_xml_data.aggregate(
       [
          { $group: { _id: null, count: { $sum: 1 } } }
       ]
    )
    

    【讨论】:

    • 谢谢!我执行了验证,现在它显示了正确的计数。
    猜你喜欢
    • 1970-01-01
    • 2016-06-01
    • 2021-09-10
    • 2021-12-06
    • 2019-08-25
    • 2017-03-19
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多