我有一个目前由内置的“_id”(ObjectId)索引/查询的集合。我不想对此密钥进行分片,因为它是顺序的(以日期为前缀)。 Mongo 2.4的文档说我可以对这个键的哈希值进行分片,听起来很棒。像这样:
sh.shardCollection(“records.active”,{_ id:“hashed”})
问题:我是否必须首先使用以下命令在活动集合上创建散列索引:
db.active.ensureIndex({_ id:“hashed”})
还是没有必要?我不想浪费空间,索引比必要的更多。
相关问题:如果我使用ensureIndex({_id:“hashed”})创建散列索引,是否可以删除默认的“ id ”索引? Mongo会不会对_id字段进行查询,对它们进行哈希处理并针对哈希索引运行它们?
...谢谢
答案 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."
}
所以答案是
您必须事先创建它,MongoDB要求您使用以下命令手动创建它:
db.collection.ensureIndex({_ id:" hashed"})