0

我想为这样的文档找到合适的分片键:

{
  "_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”字段添加为复合分片键,以便通过已经运行的作业分配它?

是否可以将数组用作分片键?

感谢所有的见解!

4

1 回答 1

2

分片键不能是数组,因为分片键上的索引不能是多键索引。我当然认为您会希望“_id”(域)成为您的分片键的一部分,如果您能找到另一种方法来确保查询隔离,那么这将有所帮助。

我有点不确定您为什么担心域名分布均匀,因为域名往往非常随机,如果您期望拥有大量不同的域,那么您应该处于良好状态。如果由于某种原因域名分配成为问题,您可以运行 MongoDB 2.4.1 并使用散列分片键

于 2013-03-25T21:22:18.850 回答