我想为这样的文档找到一个合适的分片键:
{
"_id": "yahoo.com",
"c": {
"en": {
"bdy": ",
"cats": [],
"mDesc": "",
"mHEq": {},
"mKeyw": [],
"mNames": {}
}
},
"cLgth": 566,
"cType": "text/html",
"dTime": 1224,
"jobsDone": [
"rawdataload",
"hrefanalyze",
"metatagsanalyze",
"keywordanalyze",
"categoryfinder"
],
"langs": [
"en", "de"
],
"publishedOn": {
"sims": 1362752738996
},
"tld": "com",
}
我面向用户的查询主要是通过_id从mongo获取域名。其中一些人正在使用该域的语言 后端查询运行不同类型的作业“jobsDone”。根据这些信息,选择不同范围的文件。
所以我想到只使用映射到域名的“_id”,因为它具有非常高的基数。使用域名的MD5哈希来更均匀地分发它是否有意义?
我不是关于“查询隔离”。由于大多数用户查询只是直接读取_id,我认为这很好。作业后端查询可能会更长时间运行(分散/聚集),因为用户没有看到它,但我想优化它我将“jobsDone”字段添加为复合分片键,以便通过已运行的作业分配它? / p>
是否可以将数组用作分片键?
感谢您的所有见解!
答案 0 :(得分:2)
分片键不能是数组,因为分片键上的索引不能是多键索引。我当然认为你会希望“_id”(域)成为你的分片键的一部分,如果你能找到另一种方法来确保查询隔离,那么这将有所帮助。
我有点不确定为什么你担心域名分布均匀,因为域名往往是随机的,如果你期望拥有大量不同的域名,你应该处于良好状态形状。如果由于某种原因域名分发成为问题,您可以运行MongoDB 2.4.1并使用hashed shard key。