シャーディング環境での読み込みに成功しました。正常に動作しています。しかし、シャード環境で更新すると、次のようなエラーが発生します。
WriteConcern detected an error
'update { q: { IsTagged: "0" }, u: { $set: { IsTagged: "1" } }, multi: false, upsert: false } does not contain _id or shard key for pattern { JobId: "hashed" }'.
(Response was { "ok" : 1, "code" : 61, "err" : "update { q: { IsTagged: \"0\" }, u: { $set: { IsTagged: \"1\" } }, multi: false, upsert: false } does not contain _id or shard key for pattern { JobId: \"hashed\" }", "n" : NumberLong(o), "updatedExisting" : false }).
Istaggedの値を0から1に更新する必要があります。しかし、それは読み取り関連のエラーとして表示されています。エラーは、シャードキーを指定していないことが原因であるという点を理解できます。私が使用しているコードは:
var query = Query.EQ("IsTagged", "0");
var update = Update.Set("IsTagged","1");
collection.Update(query, update);
Mongodbとの通信にC#ドライバーを使用しています。このコーディングでシャードキーに言及する方法がわかりません。
すべての対象となる更新(multi: false
したがって単一のドキュメントを対象とする) 必須 正しくルーティングするために単一のドキュメントを対象とするのに十分な情報(つまり、シャードキー、またはドキュメントの_idターゲット)。
理由を理解するために、更新を試みたときに何が起こるかを検討してください。 (multi: false
を指定して、更新するドキュメントを1つだけにしたいと言った。
まず、ドキュメントの_id
値(一意の値)を指定していないため、クエリがすべてのシャードにブロードキャストされると、結果として複数の更新が発生する可能性があります(各シャードは1つのドキュメントしか更新しませんが、3つのシャード、3つのドキュメントを合計で更新できます)。したがって、それは拒否されます。
もう1つのオプションは、更新操作を単一のシャードにのみルーティングすることです。ただし、そのためには、更新の基準の一部としてJobId
(シャードキー)を指定する必要があります。次に、操作をすべてのシャードにブロードキャストする必要はなく、単一のシャードにルーティングして、元の基準(そのようなドキュメントを1つだけ更新する)を満たすことができます。
複数のドキュメントを更新する場合は、multi
をtrue
に変更します。そうでない場合は、更新するドキュメントをより具体的にする必要があります。