Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb选择分片键_Mongodb_Sharding - Fatal编程技术网

Mongodb选择分片键

Mongodb选择分片键,mongodb,sharding,Mongodb,Sharding,我有一个mongodb收藏,我想分享。此集合保存来自用户的消息,集合中的文档具有以下属性 { _id : ObjectId, conversationId: ObjectId, created: DateTime } 所有查询都将使用ConversationID属性和由创建的分类器来完成 按\u id分片显然不起作用,因为我需要按会话id进行查询(另外\u id属于ObjectId类型,无法很好地扩展到许多插入) 按照conversationI

我有一个mongodb收藏,我想分享。此集合保存来自用户的消息,集合中的文档具有以下属性

{
     _id : ObjectId,
     conversationId: ObjectId,
     created: DateTime         
}
所有查询都将使用ConversationID属性和由创建的分类器来完成

  • \u id分片显然不起作用,因为我需要按会话id进行查询(另外\u id属于ObjectId类型,无法很好地扩展到许多插入)

  • 按照conversationId进行切分在查询隔离方面是一个合乎逻辑的选择,但我担心它不能很好地扩展许多插入(即使我在conversationId上使用哈希切分键,或者如果我将属性的类型从ObjectId更改为与GUID不同的增量类型)因为某些对话可能比其他对话更活跃(即:添加了更多的消息)

从我在mongo文档中看到的情况来看,碎片键要么是索引字段,要么是索引复合字段,存在于集合中的每个文档中

这是否意味着我可以在复合索引上创建碎片键

底线是:

  • \u id属性创建散列切分键将提供良好的数据分布

  • 在会话ID上创建切分键将提供良好的查询隔离

因此,如果这两件事都能做到的话,这两件事的结合将是非常好的

有什么想法吗


感谢您的案例,这两个字段都不是切分的好选择。例如,如果您在conversationId上进行切分,则会导致热点,即您的大多数插入都会发生在最后一个切分上,因为conversationId会随着时间单调增加。其他两个字段也存在同样的问题

此外,conversationId不会提供高度隔离,因为conversationId会随时间单调增加。(因为较新的对话会比非常旧的对话更新得更频繁)

在您的情况下,在conversationId上使用“哈希切分键”(版本2.4以后)将是一个明智的选择,因为您可以想象会有大量的对话并行进行


有关创建哈希切分键的详细信息,请参阅以下链接:[]

对于您的情况,这两个字段都不是切分的好选择。例如,如果您在conversationId上进行切分,则会导致热点,即您的大多数插入都会发生在最后一个切分上,因为conversationId会随着时间单调增加。其他两个字段也存在同样的问题

此外,conversationId不会提供高度隔离,因为conversationId会随时间单调增加。(因为较新的对话会比非常旧的对话更新得更频繁)

在您的情况下,在conversationId上使用“哈希切分键”(版本2.4以后)将是一个明智的选择,因为您可以想象会有大量的对话并行进行


有关创建哈希切分键的详细信息,请参阅以下链接:[]

谢谢您的评论。我确实这样做了,但在将数据复制到分片集合的中途,我在_id属性上得到了“E11000 duplicate key error index”,这很奇怪,因为我在我的初始集合中找不到该id的任何副本复制集合中的错误Safemode检测到错误“在版本7 | 83 | | | 5228504705A8GE238D3627B::向碎片集插入1个文档时出错,原因是::E11000重复键错误索引:消息。$\u id_uudup键:{:ObjectId(“…”)}谢谢您的评论。我确实这样做了,但在将数据复制到分片集合的中途,我在_id属性上得到了“E11000 duplicate key error index”,这很奇怪,因为我在我的初始集合中找不到该id的任何副本复制集合中的错误Safemode检测到错误“将1个文档插入版本7 | 83 | | 5228504705A8GE238D3627B::的碎片集时出错,原因是::E11000重复键错误索引:消息。$\u id_uudup键:{:ObjectId('..')}”