MongoDB中的count()与length()

在写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 这个函数来清理孤儿文档,这个内容,留作下篇文章来说。

得了,这样大概就知道问题原因了。

文章仅供自己参考学习,欢迎批评指正!

 转载文章地址:https://www.modb.pro/db/81972

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值