我正在努力解决这个问题,来自SQL环境,我们在用户ID上进行了分片。我们有多个表添加了user_id,因此我们可以进行分片。如果一个表中有100条记录,所有100条记录都在同一个用户中,那么所有100条记录都会在同一个分片中结束。
所以,我们有第一个mongo数据库,我们希望能够在必要时进行分片。有一个用户collecton,我们打算通过_id进行分片。没问题。但是还有第二个集合,其中可能有一个用户拥有数百个文档。我们希望那些转到相同的分片,(不必与用户文档相同,因为它们单独检索,但它们确实被用户以块的形式检索。)但看起来,如果我们已经添加到第二个集合的user_id分片,这还不够,分片键需要是唯一的,所以每次我们进行查找时,我们都会遍历所有分片。这不是最佳选择。那么,它是否需要完全独特,如每个集合中只有一个这样的记录?
文档表明我们遇到了问题。我希望我不理解。
答案 0 :(得分:3)
没有分片键不一定是唯一的(虽然它可以)。例如,以下分片键{userID : 1, countryID : 1}
对于具有字段的集合绝对有效(请注意,两个元素具有相同的userID和countryID):
{userID : 4, countryID : 5},
{userID : 4, countryID : 9},
{userID : 1, countryID : 5},
{userID : 2, countryID : 3},
{userID : 4, countryID : 5},
{userID : 5, countryID : 4}
据我记忆,mongo不允许您仅在丢失的密钥(以及was a bug about it)上创建分片密钥。此外,你还要can not change分片键的值。
但是你甚至可以在所有集合中使用相同的字段{a : 5}
并将其作为分片键(这将是完全愚蠢的,但你可以这样做)。
选择分片键时必须要小心,因为之后更改它会很大pain in the ass。所以好的事情在一段时间内都被阅读how to choose a sharding key.