在写NoSQL作业时发现在MongoDB中统计数据总条数时,count()和length()返回的数据不一样!!【我的集合中的真实文档数应该为7】,但是通过上网查阅的count()方法返回的结果却是6,让我很意外,不管怎么尝试都是6,直到找到了length()方法才得到正确结果,于是便上网查阅资料发现,count()方法统计的有时候不准确,会丢掉一些孤立的数据。(真是奇怪?!)
在网上找到了这篇文章讲解了count()数据不准确的原因和实现逻辑,值得自己学习!!
!!MongoDB中Count()的实现逻辑
大意是说,避免使用db.collection.count()语法而不带任何查询条件,如果这样使用的话,MongoDB会基于Metadata原信息来返回结果,得到一个近似的值,而不是集合中的真实数据条数。还提供了2种情况:1、分片集群中如果有孤儿文档,则结果不准确;2、非正常关闭mongod实例,则结果不准确;
这里,针对孤儿文档做个介绍,引用官方文档:
In a sharded cluster, orphaned documents are those documents on a shard that also exist in chunks on other shards as a result of failed migrations or incomplete migration cleanup due to abnormal shutdown. Delete orphaned documents using cleanupOrphaned to reclaim disk space and reduce confusion.
翻译过来,大概就是孤儿文档就是由于move chunk失败或者清理旧数据失败导致的分布在多个shard上的相同文档。也就是同一个文档,movechunk之后,清理失败了,导致重复出现,但是只有一个是正确的值,每次查询的时候,MongoDB也仅仅返回这个正确的值。可以使用cleanupOrphaned 这个函数来清理孤儿文档,这个内容,留作下篇文章来说。
得了,这样大概就知道问题原因了。
文章仅供自己参考学习,欢迎批评指正!