我在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。
有人能告诉我为什么聚合和普通查询会返回不同的结果吗?提前感谢您的帮助。
答案 0 :(得分:3)
我认为有两个可能的原因:
如果您的集合是分片的,则应使用聚合框架来计算文档,因为由于块移动或孤立的文档,计数操作可能不准确。 How to count in Sharded Clusters
如果您使用的是WiredTiger存储引擎(现在很可能是因为它是V3.2以来的默认存储引擎),WiredTiger存储的统计信息在不干净关闭后可能不准确。您应该在每个集合上运行db.collection.validate()
。 WiredTiger unclean shutdown
注意:您可以减少"混淆"通过使用cleanupOrphaned命令删除孤立文档,但在分片环境中,您应始终使用聚合框架。
答案 1 :(得分:0)
db.users.count()
也在计算空值。
system->catalog->inventory->stock options->Display Out of Stock Products
不计算空值。