mongodb獲取准確的行數


 

背景:

         背景 一般來說,除了由於secondary延遲可能造成查詢secondary節點數據不准以外,關於count的准確性問題,詳情請見:https://developer.aliyun.com/article/704434

 

一、現象:db.collection.count()不准確:

         MongoDB在分片后的集合上進行db.collection.count()操作時,出現結果不准確的現象,需要采用聚合的方法獲取集合的count結果,在使用MongoDB-Java客戶端做簡單的插入操作(10W條)以后,使用Studio 3T查看插入結果時,發現顯示的count結果與插入的數據不一致,偶然會多出幾條或十幾條,插入操作很簡單,其中table3被分片

 

發現問題后,通過在shell里面查詢count,命令如下

db.table3.count()

 

二、原因:

  1. 操作的是分片的集合(前提);

  2. shard分片正在做塊遷移,導致有重復數據出現;

  3. 存在孤立文檔(因為不正常關機、塊遷移失敗等原因導致);

 

三、解決方法:

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

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

 

  1. 同時追求效率和准確性,可以設置負載均衡窗口,在窗口以外禁止move chunk

  2. 強調數據准確性的場景,使用db.collection.aggregate()方法代替count

  3. 針對帶謂詞條件的count操作,將mongo版本升級到4.0以上

  4. 針對出現大量孤立文檔的情況,做孤立文檔清理

 

 

 

 

 

 

 

 

##############################################################


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM