Mongodb 从计数函数和聚合管道中给出不同的计数结果

标签 mongodb aggregation-framework

我在 mongodb 中有一个名为用户的集合。我正在尝试查找集合中所有文档的计数。

令人惊讶的是,以下查询给出了不同的结果。 对于

db.users.find({}).count()

`db.users.count()`

输出是 533911,并且对于

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

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

输出为 533950。

谁能告诉我为什么聚合和普通查询返回不同的结果?预先感谢您的帮助。

最佳答案

我发现有两个可能的原因:

  1. 如果您的集合是分片的,您应该使用聚合框架来统计文档,因为由于 block 移动或孤立文档,计数操作可能不准确。 How to count in Sharded Clusters

  2. 如果您使用 WiredTiger 存储引擎(现在很可能是这样,因为它是自 V3.2 以来的默认引擎),在非正常关闭后,WiredTiger 存储的统计信息可能不准确。您应该对每个集合运行db.collection.validate()WiredTiger unclean shutdown

注意:您可以通过使用cleanupOrphaned删除孤立文档来减少“困惑”。命令,但在分片环境中,您应该始终使用聚合框架。

关于Mongodb 从计数函数和聚合管道中给出不同的计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462024/

相关文章:

java - 使用 MongoDB、Jackson 和 MongoJack 的自定义序列化程序

mongodb - 如何将 Flutter 与 MongoDB 连接

Mongodb聚合框架: Does $group use index?

mongodb - 嵌入与链接

javascript - 查找 MongoDB 中一系列日期中缺失的日期

arrays - 如何从用户已选择城市键的数组中获取结果,如果用户选择了城市,这些结果也将来自城市模型中未选择的城市

javascript - Next js - 如何在 url 中为 api 传递多个参数?

javascript - 在 Mongoose/MongoDB 中,如何更新数组的数组中的属性

node.js - mongoose - 尝试保存文档数组,仅保存空数组

mongodb - $sum 有多个条件