リストフィールドをシャードキーとして使用してシャーディングすることはできないと主張しているように思われるフィードバックの一部に基づいて、MongoDBの制限を使用してこのユースケースをシャーディングする方法を説明したいと思います:
>元のオブジェクト:
widget:
{
primary_key: '2389sdjsdafnlfda'
categories: ['hair', 'nails', 'dress']
colors: ['red', 'white']
#All the other fields in the document that don't need to be queried upon:
...
...
}
データレイヤーは、シャードキー用に選択されたフィールドの要素数に基づいて、オブジェクトを複数のポインターオブジェクトに分割します。
widget_pointer:
{
primary_key: '2389sdjsdafnlfda'
categories: 'hair',
colors: ['red', 'white']
}
widget_pointer:
{
primary_key: '2389sdjsdafnlfda'
categories: 'nails',
colors: ['red', 'white']
}
widget_pointer:
{
primary_key: '2389sdjsdafnlfda'
categories: 'dress',
colors: ['red', 'white']
}
説明:
- フィールド
categories
これで、MongoDBのシャードキーになります。 - これで、元のオブジェクトがKey-Valueストアに保存されます。 MongoDBのデータに対するクエリは、Key-Valueストアからオブジェクトを取得するために使用されるポインターオブジェクトを返します。
- MongoDBデータのクエリは、1つのシャードにのみヒットします。
- MongoDBデータへの挿入は、リスト内の要素と同じ数のシャードにヒットします。ほとんどの場合、シャードの総数のごく一部のみが影響を受けます。