根据我得到的一些反馈,我似乎断言不可能使用列表字段作为分片键进行分片,我想说明如何使用 MongoDB 的限制对这个用例进行分片:
原始对象:
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:
...
...
}
数据层根据为分片键选择的字段中的元素数量将对象拆分为多个指针对象:
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']
}
解释:
- 该字段
categories
现在可以是 MongoDB 中的分片键。
- 原始对象现在将存储在键值存储中。针对 MongoDB 中的数据的查询将返回一个指针对象,该对象将用于从键值存储中获取对象。
- 对 MongoDB 数据的查询只会命中一个分片。
- 对 MongoDB 数据的插入将与列表中的元素一样多的分片,在大多数情况下,只有分片总数的一小部分会受到影响。