在MongoDB中正确实现散列碎片密钥

时间:2013-03-28 12:55:33

标签: mongodb

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

sh.shardCollection(“records.active”,{_ id:“hashed”})

问题:我是否必须首先使用以下命令在活动集合上创建散列索引:

db.active.ensureIndex({_ id:“hashed”})

还是没有必要?我不想浪费空间,索引比必要的更多。

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

...谢谢

2 个答案:

答案 0 :(得分:3)

将需要 _id 索引和哈希_id 索引。在MongoDB 2.4中,您不必在分片集合之前显式调用 db.active.ensureIndex({_id:“hashed”}),但如果不是 sh.shardCollection( “records.active”,{_ id:“hashed”})将为您创建散列索引。

复制需要 _id 索引。

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

答案 1 :(得分:1)

我自己尝试过使用mongoDB 2.4.11。

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

然而,当我尝试按照下面的方式对shard集合执行命令时,

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"})