问题描述
问题如图,后来上网查了一下,发现了这是正常现象:
官方文档解释了这种现象的原因以及解决方法:
不准确的原因:
- 操作的是分片的集合(前提);
- 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客户端在分片时候的使用。