列表字段可以是MongoDB中的分片键吗?
有些数据如下所示:列表字段可以是MongoDB中的分片键吗?,mongodb,inner-join,sharding,Mongodb,Inner Join,Sharding,有些数据如下所示: widget: { categories: ['hair', 'nails', 'dress'] colors: ['red', 'white'] } SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red' 需要按如下方式查询数据: widget: { categories: ['hair', 'nails', 'dress'] colors
widget:
{
categories: ['hair', 'nails', 'dress']
colors: ['red', 'white']
}
SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red'
需要按如下方式查询数据:
widget:
{
categories: ['hair', 'nails', 'dress']
colors: ['red', 'white']
}
SELECT * FROM widget_table WHERE categories == 'hair' AND colors == 'red'
希望将此数据放入MongoDB分片集群。然而,理想的切分键似乎不是列表字段。在这种情况下,这是不可能的,因为所有字段都是列表字段
- 是否可以使用列表字段,例如字段
作为MongoDB中的分片键?categories
- 如果是,我应该注意/注意哪些事情?
一个明显的问题是:“你需要碎片吗?”分片是使用MongoDB扩展写操作的一种方法,但如果您还没有达到当前配置的极限,则可能会有过大的杀伤力。根据我得到的一些反馈,似乎断言不可能使用列表字段作为分片键进行分片,我想说明如何使用MongoDB的限制来分割这个用例: 原始对象: 数据层根据为切分键选择的字段中的元素数将对象拆分为多个指针对象: 说明:
- 在MongoDB中,
字段现在可以成为shard键李>categories
- 原始对象现在将存储在键值存储中。对MongoDB中数据的查询将返回一个指针对象,该对象将用于从键值存储中获取该对象
- 对MongoDB数据的查询将只命中一个碎片李>
- 对MongoDB数据的插入将影响列表中元素的数量,在大多数情况下,只有一小部分碎片会受到影响
\u id
字段不能是数组,因此仍然是候选字段。@ChrisDutrow:有关MongoDB中分片的介绍,请参阅:。TL;DR:如果你跳到幻灯片32(机制)的部分,你会发现一个分区方法的说明(逻辑块表示一系列文档碎片键)。这个答案不是“错误信息”-问是否可以做一些事情是相当奇怪的(MongoDB文档清楚地说不能)然后抱怨解释为什么不能这样做的答案是“错误的信息”,因为这不是你想要听到的。这是非常不相关的。您描述的是如何更改模式,以便可以在简单的categories字段上进行切分。不能将数组(列表)字段用作分片键。如果您更改模式,使其不再是数组,则可以对其进行切分。因为它不是一个列表。嗨,阿西娅。这个例子实际上展示了如何在MongoDB的限制下使用用例进行切分。数据层本身作为MongoDB之上添加功能的另一个数据库层。它使用MongoDB存储索引。最终的结果将是数据和索引在多台机器上分片。换句话说,读写操作只会影响机器的一个子集,向集群中添加更多的碎片或多或少会线性增加每单位时间内对数据执行的操作量。@ChrisDutrow:我同意