sql >> Databasteknik >  >> NoSQL >> MongoDB

Kan ett listfält vara en skärvnyckel i MongoDB?

Baserat på en del av feedbacken jag får som verkar hävda att det inte är möjligt att skärpa med ett listfält som en skärvnyckel, jag ville illustrera hur detta användningsfall kunde skäras med MongoDB:s begränsningar:

Originalobjekt:

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

Datalager delar upp objekt i flera pekobjekt baserat på antalet element i fältet som valts för shard-nyckeln:

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

Förklaring:

  • Fältet categories kan nu vara shard-nyckeln i MongoDB.
  • Det ursprungliga objektet kommer nu att lagras i ett nyckel-värdelager. Frågor mot data i MongoDB kommer att returnera ett pekobjekt som kommer att användas för att hämta objektet från nyckel-värdelagret.
  • Frågor om MongoDB-data kommer bara att träffa en skärpa.
  • Infogningar på MongoDB-data kommer att träffa lika många shards som det finns element i listan, i de flesta fall kommer endast en liten delmängd av det totala antalet shards att påverkas.


  1. Hitta dagens sista dokument för de senaste 7 dagarna

  2. kan inte ansluta till redis-behållare från app-behållare

  3. Behöver göra .toArray() för att få utdata från mongodb .find() på nyckelnamn inte värde

  4. Redis med Resque och Rails:ERR-kommando tillåts inte när minne> 'maxmemory' används