任意のフィールドに対する一意の制約
項目一覧
一意のフィールドをシャードキーとして使用できない場合や、複数のフィールドに一意性を適用する必要がある場合は、「プロキシ コレクション」として機能する別のコレクションを作成する必要があります。 このコレクションには、元のドキュメントへの参照( ObjectId
)と一意のキーの両方が含まれている必要があります。
ユーザー情報をストアするコレクション records
を考慮します。フィールド email
はシャードキーではありませんが、一意である必要があります。
proxy
コレクションには、次のものが含まれます。
{ "_id" : ObjectId("...") "parent_id" : "<ID>" "email" : "<string>" }
次のコマンドを使用して、email
フィールドに一意のインデックスを作成します。
db.proxy.createIndex( { "email" : 1 }, { unique : true } )
次の例えでは、まず、ターゲット フィールドと生成された一意の ID を含むドキュメントを proxy
コレクションに挿入します。操作が成功すると、完全なドキュメントが records
コレクションに挿入されます。
records = db.getSiblingDB('records'); proxy = db.getSiblingDB('proxy'); var primary_id = ObjectId(); proxy.insertOne({ "_id" : primary_id "email" : "example@example.net" }) // if: the above operation returns successfully, // then continue: records.insertOne({ "_id" : primary_id "email": "example@example.net" // additional information... })
この方法では、ドキュメントの挿入時に MongoDB が自動的に ID を作成するのではなく、primary_id
フィールドに一意の ID を作成する必要があることに注意してください。
複数のフィールドに一意性を強制する必要がある場合、各フィールドには独自のプロキシ コレクションが必要になります。
Considerations
アプリケーションは、ドキュメントを "プロキシ" コレクションに挿入するときにエラーを検出し、2 つのコレクション間の整合性を強制する必要があります。
プロキシ コレクションでシャーディングが必要な場合は、一意性を強制したい単一フィールドでシャードする必要があります。
シャーディングされたプロキシ コレクションを使用して複数のフィールドに一意性を強制するには、一意性を適用するフィールドごとに 1 つのプロキシ コレクションが必要です。1 つのプロキシ コレクションに複数の一意なインデックスを作成した場合、プロキシ コレクションをシャードすることはできません。