1

有一些看起来像这样的数据:

widget:
{
    categories: ['hair', 'nails', 'dress']
    colors:     ['red', 'white']
}

需要这样查询数据:

SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red'

想把这些数据放到一个 MongoDB 分片集群中。但是,似乎理想的分片键不会是列表字段。在这种情况下,这是不可能的,因为所有字段都是列表字段。

  • 是否可以使用列表字段,例如categoriesMongoDB 中作为分片键的字段?
  • 如果是这样,我应该注意/注意什么?

非常感谢!

4

2 回答 2

2

根据我得到的一些反馈,我似乎断言不可能使用列表字段作为分片键进行分片,我想说明如何使用 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 数据的插入将与列表中的元素一样多的分片,在大多数情况下,只有分片总数的一小部分会受到影响。
于 2013-05-07T17:40:24.910 回答
1

MongoDB 中的分片(如 2.4 版)通过根据shard key将文档划分为值范围来工作。列表或数组分片键作为分片键没有意义,因为它包含多个值。

还值得注意的是,分片键是不可变的(一旦为文档设置就无法更改),因此您不想选择要更新的字段。

如果您的文档中没有任何候选字段,您可以随时添加一个。在您的情况下,一个简单的解决方案可能是使用MongoDB 2.4 中的新散列分片:

您选择作为散列分片键的字段应具有良好的基数或大量不同的值。散列键适用于单调增加的字段,如 ObjectId 值或时间戳。

在分片之前要考虑的一个明显问题是“你需要分片吗?”。分片是一种使用 MongoDB 横向扩展写入的方法,但如果您还没有突破当前配置的限制,则可能会过度杀伤力。

于 2013-05-06T23:28:59.093 回答