码迷,mamicode.com
首页 > 数据库 > 详细

mongodb count 导致不正确的数量(mongodb count 一个坑)

时间:2018-02-08 20:26:34      阅读:984      评论:0      收藏:0      [点我收藏+]

标签:clear   ntb   ase   ntop   timeout   connect   str   new   span   

https://www.cnblogs.com/Kellana/p/5844919.html

 

在mongodb 集群中,if  存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果:技术分享图片

skip 只能获取到54631,而count查出来了77396条数据,这就是坑,一样的查询条件,不一样的结果,为了避免这种结果,可以使用聚合查询,

技术分享图片

如上图所示,着里又是一个坑。

mongodb 的count详细文档见官网:https://docs.mongodb.com/manual/reference/command/count/

 

 

https://segmentfault.com/q/1010000008787002

 

 

该问题已经解决,使用的是最新驱动mongo-java-driver-3.4.0,通过下面的方法可以在分片集群模式下,准确的统计到记录数量,感谢大家的相助!

mongo shell >> db.collection.aggregate([{$match:{categories:"Bakery"},{$group:{"_id":null,"count":{$sum:1}}}}])

 public long getCount() {
                String user = "用户名";
                String database = "admin";
                String password = "密码";
                MongoCredential credential = MongoCredential.createCredential(user,database, password.toCharArray());
        
                MongoClientOptions options = MongoClientOptions.builder()
                        .connectionsPerHost(10)
                        .threadsAllowedToBlockForConnectionMultiplier(10)
                        .socketTimeout(20000)
                        .connectTimeout(15000)
                        .maxWaitTime(50000)
                        .build();
        
                MongoClient mongoClient = new MongoClient(new ServerAddress("IP地址", "端口"), Arrays.asList(credential), options);
        
                MongoDatabase mongoDatabase = mongoClient.getDatabase("数据库");
                MongoCollection<Document> collection = mongoDatabase.getCollection("数据表");
        
                final long[] count = new long[1];
                Block<Document> printBlock = new Block<Document>() {
                    @Override
                    public void apply(final Document document) {
                         count[0] = (long) document.get("count");
                    }
                };
                Bson bson = Filters.eq("categories", "Bakery");
                collection.aggregate(
                        Arrays.asList(
                                Aggregates.match(bson),
                                Aggregates.group(null, Accumulators.sum
                                        ("count", 1L))
                        )
                ).forEach(printBlock);
        
                return count[0];
}

 

 

 

 
 

mongodb count 导致不正确的数量(mongodb count 一个坑)

标签:clear   ntb   ase   ntop   timeout   connect   str   new   span   

原文地址:https://www.cnblogs.com/0xcafedaddy/p/8432436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!