Baseret på nogle af de tilbagemeldinger, jeg får, som synes at hævde, at det ikke er muligt at shard ved hjælp af et listefelt som en shard-nøgle, ville jeg illustrere, hvordan denne use case kunne shardes ved hjælp af MongoDBs begrænsninger:
Original 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:
...
...
}
Datalaget opdeler objektet i flere markørobjekter baseret på antallet af elementer i feltet, der er valgt til shard-nøglen:
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']
}
Forklaring:
- Feltet
categories
kan nu være shard-nøglen i MongoDB. - Det originale objekt vil nu blive gemt i et nøgleværdilager. Forespørgsler mod dataene i MongoDB returnerer et pointer-objekt, der vil blive brugt til at hente objektet fra nøgleværdi-lageret.
- Forespørgsler på MongoDB-dataene rammer kun ét shard.
- Indsættelser på MongoDB-dataene vil ramme lige så mange shards, som der er elementer på listen, i de fleste tilfælde vil kun en lille delmængde af det samlede antal shards blive påvirket.