Basierend auf einigen Rückmeldungen, die ich erhalte und die zu behaupten scheinen, dass es nicht möglich ist, ein Listenfeld als Shard-Schlüssel zu fragmentieren, wollte ich veranschaulichen, wie dieser Anwendungsfall mithilfe der Einschränkungen von MongoDB fragmentiert werden kann:
Ursprüngliches Objekt:
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:
...
...
}
Die Datenschicht teilt das Objekt in mehrere Zeigerobjekte auf, basierend auf der Anzahl der Elemente im Feld, das für den Shard-Schlüssel ausgewählt wurde:
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']
}
Erklärung:
- Das Feld
categories
kann jetzt der Shard-Schlüssel in MongoDB sein. - Das ursprüngliche Objekt wird nun in einem Schlüsselwertspeicher gespeichert. Abfragen der Daten in MongoDB geben ein Zeigerobjekt zurück, das zum Abrufen des Objekts aus dem Schlüsselwertspeicher verwendet wird.
- Abfragen zu den MongoDB-Daten treffen nur einen Shard.
- Einfügungen in die MongoDB-Daten treffen so viele Shards wie Elemente in der Liste vorhanden sind, in den meisten Fällen ist nur eine kleine Teilmenge der Gesamtzahl von Shards betroffen.