Mongo は、タグ対応シャード データベースの新しく更新されたドキュメントを正しいシャードに移動しますか?
MongoDb ver.で以下の設定をしています。2.4.6 で C# ドライバー 1.8.3 を使用すると、タグ対応シャーディングの更新シナリオで期待される結果が返されませんでした。次のシナリオを確認し、MongoDb でこれが可能かどうかをお知らせください。
実験用に次の設定を行いました。
//use the default 'test' database
db = db.getSiblingDB('test');`
//Add shards
sh.addShard( "shard0001.local:27017" );
sh.addShard( "shard0002.local:27017" );
//Enable sharding for the database,
sh.enableSharding("test");
//Enable sharding for a collection,
sh.shardCollection("test.persons", { "countryCode": 1, "_id": 1 } );
//Add shard tags,
sh.addShardTag("shard0001", "USA");
sh.addShardTag("shard0002", "JPN");
//Tag shard key ranges,
sh.addTagRange("test.persons", { countryCode: 0 }, { countryCode: 1 }, "USA");
sh.addTagRange("test.persons", { countryCode: 1 }, { countryCode: 2 }, "JPN");
次に、初期データ作成のために次のスクリプトを実行します。
//MongoDB sharding test,
db = db.getSiblingDB('test')
//Load data
//USA: countryCode 0
//JPN: countryCode 1
for (var i=0; i < 1000, i++) {
db.persons.insert( { name: "USA-" + i, countryCode: 0 } )
db.persons.insert( { name: "JPN-" + i, countryCode: 1 } )
この時点で、各シャードに 1000 レコード、shard0001 に USA 国コードに 1000 レコード、shard0002 に JPN に 1000 レコードがあります。
C# から、次の擬似コードが得られます。
collection.insert( 1 document of countryCode=0)
collection.insert( 1 document of countryCode=1)
実行すると、各シャードに 1001 個のドキュメントがあり、これまでのところ問題ありません。
次に、shard0001 の 1 つのドキュメントを、countryCode=0 から countryCode=1 に _id で更新しました。しかし、JPNシャード(shard0002)に1002レコード、USAシャード(shard0001)に1001レコードという結果になりました。Mongos は、新しい countryCode 1 に基づいて更新を shard0002 にルーティングして挿入を実行し、shard0001 のドキュメントを更新していないようです。したがって、2 つの異なるシャードに同じ _id の 2 つのドキュメントがあります。
mongo が shard0001 の実際のドキュメントを更新すると予想していましたが、countryCode を 0 から 1 に変更すると、そのドキュメントが代わりに shard0002 に移動することに気付きました。Mongo はこれを自動的に行いますか?
ドキュメント レコードを shard0001 から手動で削除できることはわかっていますが、これを自分で手動で行う必要はありますか?