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.