Mongo分区后分片下count记录不准确

问题描述

image

问题如图,后来上网查了一下,发现了这是正常现象:

官方文档解释了这种现象的原因以及解决方法:

不准确的原因:

  • 操作的是分片的集合(前提);
  • shard分片正在做块迁移,导致有重复数据出现
  • 存在孤立文档(因为不正常关机、块迁移失败等原因导致)

1、count和aggregate的不同:在mongoDB中,count和aggregate是在两支不同的程序中实现的,aggregate的实现是考虑到了shard的环境的,所以官方文档是推荐使用aggregate来进行shard环境下的count。
2、MongoDB shell下使用aggregate和使用Java MongoDB驱动使用aggregate来进行count,结果应该是一样的,因为两者都是使用的aggregate。
您提到Issue大概是MongoDB shell和Java MongoDB驱动进行count的结果不一致。
这种不一致,我觉得可能是:
1)比较的过程有没有纰漏;
2)所用的Java MongoDB驱动是否有纰漏。

解决方法

使用聚合aggregate的方式查询count数量,shell命令如下:

db.collection.aggregate(
   [
      { $group: { _id: null, count: { $sum: 1 } } }
   ]
)

java代码:

DBObject groupFields = new BasicDBObject("_id", null);
groupFields.put("count", new BasicDBObject("$sum", 1));
BasicDBObject group = new BasicDBObject("$group", groupFields);
List<BasicDBObject> aggreList = new ArrayList<BasicDBObject>();
aggreList.add(group);
AggregateIterable<Document> output = collection.aggregate(aggreList);

做了聚合发现好慢,其次好像数据还是对不上

 

刚用mongo这玩意儿,发现还是有好多坑要趟~

发现在mongos客户端下,用聚合查询查出来是准确的,count在分片的时候是真的不适用;另一个情况还要考虑java客户端在分片时候的使用。

孤立文档

Reference

https://www.jianshu.com/p/c0a351927e69

猜你喜欢

转载自www.cnblogs.com/tuhooo/p/9726294.html
今日推荐