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

时间:2017-01-04 10:50:55

标签: mongodb aggregation-framework

我在mongodb中有一个名为users的集合。我试图找到集合中所有文件的数量。

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

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。

有人能告诉我为什么聚合和普通查询会返回不同的结果吗?提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我认为有两个可能的原因:

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

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

  3. 注意:您可以减少"混淆"通过使用cleanupOrphaned命令删除孤立文档,但在分片环境中,您应始终使用聚合框架。

答案 1 :(得分:0)

db.users.count()

也在计算空值。

system->catalog->inventory->stock options->Display Out of Stock Products

不计算空值。