mongodb分片,使用多个字段作为分片键?

mongodb分片,使用多个字段作为分片键?,mongodb,sharding,Mongodb,Sharding,我有以下架构的文档: { idents: { list: ['foo', 'bar', ...], id: 123 } ... } 字段idents.list是字符串数组,始终至少包含一个元素。 字段标识可能存在,也可能不存在 随着时间的推移,更多的条目被添加到“idents.list”中,在将来的某个时候,字段idents.id也可能被设置 这两个字段用于清楚地标识文档,因此与碎片密钥相关。 是否可以将切分用于此模式 更新: 文档总是通过{idents.list:

我有以下架构的文档:

{
  idents: {
    list: ['foo', 'bar', ...],
    id: 123
  }
  ...
}
字段idents.list是字符串数组,始终至少包含一个元素。 字段标识可能存在,也可能不存在

随着时间的推移,更多的条目被添加到“idents.list”中,在将来的某个时候,字段idents.id也可能被设置

这两个字段用于清楚地标识文档,因此与碎片密钥相关。 是否可以将切分用于此模式

更新:
文档总是通过
{idents.list:'foo'}
{$OR:[{idents.list:'foo'},{idents.id:42}]}

是的,您可以这样做。文件说:

Use a compound shard key that uses two or three values from all documents that provide the right mix of cardinality with scalable write operations and query isolation.

文档说切分键永远不会改变,在我的用例中,列表会随着时间的推移而改变。因此,作为碎片密钥,这似乎没有意义。当很少/从未通过shardkey的条目进行查询时,切分是否有帮助?另一方面,更新/写入可以通过shard键(例如,散列的_id)完成。如果不使用shard键进行查询,那么您将有一个分散-聚集查询,这将是无效的。您不能将
$update
用于分片密钥内容,这是正确的,但您可以删除文档并插入新文档。如果您经常这样做,可能效率不高,但是考虑到当您增加数组大小时mongodb如何重新分配空间,这可能没有多大区别。谢谢您的评论,我没有想到这种可能性。删除和重新插入当然在某些方面是有问题的,因为并发写入。。。在我看来,切分并不是一件小事,幸运的是,目前没有必要使用多个字段作为切分键。但通过使用多个键,我们永远无法对其进行哈希切分键。这是我的理解。