6

我有一个当前由内置“_id”(ObjectId)索引/查询的集合。我不想在这个键上分片,因为它是顺序的(以日期为前缀)。Mongo 2.4 的文档说我可以对这个键的哈希进行分片,这听起来很棒。像这样:

sh.shardCollection("records.active", { _id: "hashed" } )

问题:我是否必须首先在活动集合上创建散列索引:

db.active.ensureIndex({ _id: "hashed" })

还是没有必要?我不想用不必要的索引来浪费空间。

相关问题:如果我确实使用 ensureIndex({ _id: "hashed"}) 创建了一个散列索引,我可以删除默认的“ id ”索引吗?Mongo 会知道对 _id 字段进行查询,对它们进行哈希处理并针对哈希索引运行它们吗?

谢谢...

4

2 回答 2

3

_id索引和散列的 _id索引都需要。在 MongoDB 2.4 中,您不必在对集合进行分片之前显式调用db.active.ensureIndex({ _id: "hashed" }),但如果您不这样做,则sh.shardCollection("records.active", { _id:" hashed" } )将为您创建散列索引。

复制需要_id索引。

要在 MongoDB 中对集合进行分片,您必须在分片键上有一个索引。这在 MongoDB 2.4 中没有改变,分片工作需要散列 _id索引。

于 2013-03-28T15:03:23.387 回答
1

我自己尝试过,使用 mongoDB 2.4.11。

我创建文档并将其插入到新集合中。查询被触发到 mongos 服务器。我插入的所有 1,000,000 个文档都作为分片集群主分片 A 进入(您可以使用 sh.status() 进行检查)。

但是,当我尝试按照以下命令执行分片收集时,

sh.shardCollection("database.collection",{_id:"hashed"})

它显示错误如下

{
    "proposedKey" : {
        "_id" : "hashed"
    },
    "curIndexes" : [
        {
            "v" : 1,
            "name" : "_id_",
            "key" : {
                "_id" : 1
            },
            "ns" : "database.collection"
        }
    ],
    "ok" : 0,
    "errmsg" : "please create an index that starts with the shard key before sharding."
}

所以答案是

  1. 是的,它需要散列索引
  2. 您必须事先创建它,MongoDB 要求您使用以下命令手动创建它:

    db.collection.ensureIndex( { _id: "hashed" } )

于 2014-09-16T06:36:49.403 回答