MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Kann ein Listenfeld ein Shard-Schlüssel in MongoDB sein?

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.