シャーディングされたコレクションに新しいユニークインデックスを作成できますが、インデックスにシャードキーがプレフィックスとして含まれている場合に限ります。
このタスクについて
インデックスの一意性制約により、コレクション内のドキュメントはインデックスされたフィールドに対して一意の値を持つことが保証されます。シャーディングされたコレクションの場合、MongoDB はインデックスがシャードキーである場合、またはシャードキーを接頭辞として含む場合にのみ一意性を強制します。
すでにシャーディングされたコレクションの場合、シャードキーがプレフィックスとして含まれていない限り、他のフィールドに一意なインデックスを作成することはできません。インデックスにシャードキーがプレフィックスとして含まれていない場合、createIndexes コマンドを実行するとMongoDB はエラーを返します。
シャードキーの一部ではないフィールドの一意性を維持する方法については、「任意のフィールドに対する一意の制約」を参照してください。
始める前に
コレクションのシャードキーを識別します。シャードキーを表示するには、
sh.status()メソッドを実行し、出力のコレクションを指定します。既存のドキュメントがフィールドの一意性制約に違反していないことを確認します。シャードに重複値を持つドキュメントが含まれている場合、インデックスの作成操作は重複のないシャードでは成功するものの、重複のあるシャードでは失敗する可能性があり、シャード間でインデックスが不一致になる可能性があります。
手順
次の例では、region_idフィールドでシャーディングされたaccounts.namesコレクションのemailフィールドにユニークインデックスを作成しています。
シャードキーを確認します
sh.status() メソッドを実行し、出力の accounts.names コレクションでシャードキーが region_id であることを確認します。
sh.status()