Mongo分区后分片下count记录不准确
问题描述

问题如图,后来上网查了一下,发现了这是正常现象:
官方文档解释了这种现象的原因以及解决方法:
不准确的原因:
- 操作的是分片的集合(前提);
- 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
Mongo分区后分片下count记录不准确的更多相关文章
- Atitit 分区后的查询 mysql分区记录的流程与原理
Atitit 分区后的查询 mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...
- mongo 3.4分片集群系列之八:分片管理
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之七:配置数据库管理
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之六:详解配置数据库
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之五:详解平衡器
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之一:浅谈分片集群
这篇为理论篇,稍后会有实践篇. 这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mong ...
- windows10磁盘分区后,如何恢复分区,回到未分区之前
windows10磁盘分区后,恢复到分区以前的状态 1.我的电脑右键======>管理 2.找到磁盘管理 3.因为我的H盘原来是和F盘是同一个分区,只是拆分出来了,所有,找到H盘(确保数据都做过 ...
- Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- 从多表连接后的select count(*)看待SQL优化
从多表连接后的select count(*)看待SQL优化 一朋友问我,以下这SQL能直接改写成select count(*) from a吗? SELECT COUNT(*) FROM a LEFT ...
随机推荐
- golang学习笔记 ---命令行参数
os 包以跨平台的方式,提供了一些与操作系统交互的函数和变量.程序的命令行参数可从os包的Args变量获取:os包外部使用os.Args访问该变量. os.Args变量是一个字符串(string)的切 ...
- git 使用经验与技巧总结 (不断更新中)
git 使用技巧总结 说明: 本地repo已经有啦,对应的远程repo 为tiger, 本地分支为master. 问题一: 当拉取代码的remote repo仓库为tiger, 而现在要将修 ...
- 王勇详谈 Linux Deepin 背后的故事
(Linux Deepin最近发布了12.12版本.其也许是国内第一款比较优秀的桌面Linux系统.在此向致力于研发国产OS系统的猿人们表示敬意.虽然Deepin只是基于Ubuntu在桌面应用和UI方 ...
- CSS margin属性与用法教程
margin 属性是css用于在一个声明中设置所有 margin 属性的简写属性,margin是css控制块级元素之间的距离, 它们之间是透明不可见的. margin属性包含了margin left ...
- 在 Mac 上使用多点触控手势
使用多点触控触控板或妙控鼠标,可以通过轻点.轻扫.捏合或开合一根或多根手指进行有用的操作. 触控板手势 有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”.您 ...
- chrome 版本 29.0.1547.76 m 解决打开新标签页后的恶心页面的问题
个人非常不喜欢这个版本的新标签页的样子,特别是一再输入框中输入要搜索的东西,自动跑到标题栏中去了,比吃屎还恶心.下面是解决办法: 在地址栏输入:chrome://flags/ 按Ctrl+F,输入下面 ...
- unity, Collider2D.bounds的一个坑
Note that this will be an empty bounding box if the collider is disabled or the game object is inact ...
- ms12_004漏洞进行渗透
环境: 攻击机:kail linux (IP:192.168.31.54) 目标机:winds 7 (IP:192.168.31.136) 1.启动metaspolit 2.输入命令search ms ...
- 6个P2P流媒体开源项目介绍
P2P流媒体开源项目介绍 1. PeerCast 2002年成立,最早的开源P2P流媒体项目.PeerCast把节点按树结构组织起来, 每个频道都是一个树, 直播源是根节点,父节点只给子节点提供数据 ...
- x64共享库中的位置无关代码(PIC)
原作者:Eli Bendersky http://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-li ...