我在 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。
谁能告诉我为什么聚合和普通查询返回不同的结果?预先感谢您的帮助。
最佳答案
我发现有两个可能的原因:
如果您的集合是分片的,您应该使用聚合框架来统计文档,因为由于 block 移动或孤立文档,计数操作可能不准确。 How to count in Sharded Clusters
如果您使用 WiredTiger 存储引擎(现在很可能是这样,因为它是自 V3.2 以来的默认引擎),在非正常关闭后,WiredTiger 存储的统计信息可能不准确。您应该对每个集合运行
db.collection.validate()
。 WiredTiger unclean shutdown
注意:您可以通过使用cleanupOrphaned删除孤立文档来减少“困惑”。命令,但在分片环境中,您应该始终使用聚合框架。
关于Mongodb 从计数函数和聚合管道中给出不同的计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41462024/