レプリケーション セット (それぞれ 3 つのインスタンス) を持つ 2 つのシャードがあります。シャードされたコレクションに対して行うcount()
と、実際のドキュメント数よりもはるかに多くのドキュメントが取得されます (250 万以上のドキュメントの違い)。ループfind()
でカウンターをインクリメントするときと同じです。forEach()
ドキュメントの実際の数を知るにはどうすればよいですか? まず第一に、私は増加傾向を知っています。つまり、急激に増加することはありません。次に、次の M/R スクリプトを使用してドキュメントをカウントすると、実際のドキュメント数が得られます (想定どおり)。このスクリプトを使用して、重複したドキュメントを表示します。重複数は数百万ではなく数千です。そして、test_duplicate_collection
重複を差し引いた数から、実際のドキュメント数がわかります。
var map = function(){
emit(this.doc_id, 1);
};
var reduce = function(key, values){
var result = 0;
values.forEach(function(value) {
result += value;
});
return result;
};
db.test_collection.mapReduce(map, reduce, "test_duplicate_collection",null );
現在、バランシング中に、一部のチャンクが別のシャードに転送されている間にまだ削除されていないことが発生する可能性があることを理解しています。しかし、ステータス ( sh.status()
) を見ると、すべてのチャンクが均等に分散されていることがわかります。また、書き込み操作を一時停止して時間がかかるかどうかを確認しようとしましたが、何も起こりませんでした。
移動されたチャンクの削除はまだ進行中だと言うかもしれません。実際、シャーディングを使い始めたばかりの頃、シャード コレクションの数が (書き込み操作なしで) わずかに減少しました。しかし現在は、経年変化はなく、ただ止まっているだけです。孤立したドキュメントを見つけることを期待して( https://groups.google.com/forum/#!topic/mongodb-user/OKH5_KDO04Iorphanage.js
のスクリプトを使用して)使用しようとしましたが、そのようなドキュメントは見つかりませんでした。
私の質問は、実際の数よりも多くのドキュメントを提供する理由となる可能性があるものですcount()
(つまり、M / Rスクリプトに対して)。find().forEach()
あなたの助けに感謝。
編集1
シャードの 1 つでレプリケーション セットの構成に問題がありました。具体的には、構成ファイルにマスターが設定されていません。MMS ダッシュボードでは、他のレプリケーション ホストによってリッスンされたホストをPrimary
常に見ていました。Slave
これを修正したところ、forEach
ループ カウントは上記の M/R スクリプトと同じ数のドキュメントを表示し始めました。したがって、現在の唯一の問題はcount()
それ自体にあります。
MongoDB JIRA で、シャード環境での count() に関する次の未解決のバグを見つけましたhttps://jira.mongodb.org/browse/SERVER-3645バランサーで移動。回避策として、このバグは常に true であるクエリを配置することを提案しています。私もそれを試しましたが、それでも以前と同じようにカウントを返します。