sql >> Database teknologi >  >> NoSQL >> MongoDB

Kan et listefelt være en shard-nøgle i MongoDB?

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.


  1. Bindende dynamisk serversvar (indlejret json)

  2. MongoDB - Argumentet til $size skal være et array, men var af typen:EOO / mangler

  3. Forespørgsel, hvor summen af ​​to felter er mindre end den angivne værdi

  4. Mongoose .save() gemmer ikke i databasen?