sql >> Database >  >> NoSQL >> MongoDB

Kan een lijstveld een Shard-sleutel zijn in MongoDB?

Op basis van een deel van de feedback die ik krijg en die lijkt te beweren dat het niet mogelijk is om een ​​lijstveld als een shardsleutel te gebruiken, wilde ik illustreren hoe deze use-case zou kunnen worden geshard met behulp van de beperkingen van MongoDB:

Origineel object:

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: 
    ...
    ...
}

Gegevenslaag splitst object in meerdere aanwijzerobjecten op basis van het aantal elementen in het veld dat is gekozen voor de shardsleutel:

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']
}

Uitleg:

  • Het veld categories kan nu de shard-sleutel zijn in MongoDB.
  • Het oorspronkelijke object wordt nu opgeslagen in een sleutelwaardearchief. Query's op de gegevens in MongoDB retourneren een pointer-object dat zal worden gebruikt om het object uit de key-value store te halen.
  • Query's op de MongoDB-gegevens raken slechts één shard.
  • Invoegingen op de MongoDB-gegevens zullen evenveel shards raken als er elementen in de lijst zijn, in de meeste gevallen wordt slechts een kleine subset van het totale aantal shards beïnvloed.


  1. Server Side Sorting met Mongoose (mongodb + node.js)

  2. Is het mogelijk om queryprojectie te gebruiken op dezelfde verzameling die een $elemMatch-projectie heeft?

  3. Ongeldige ns bij verbinding met mongodb-server

  4. Mongodb 2.4 2dsphere-query's erg traag (met $geoIntersects)?