不能在mongodb上收集一个集合

时间:2013-09-02 14:03:57

标签: mongodb


我在mongo上有一个db(“mydb”),它包含2个集合(c1和c2)。 c1已经是哈希分片。我想以同样的方式对第二个集合进行分片。我收到以下错误:

use mydb
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"})
    {
"proposedKey" : {
    "LOG_DATE" : "hashed"
},
"curIndexes" : [
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "ns" : "mydb.c1",
        "name" : "_id_"
    }
],
"ok" : 0,
    "errmsg" : "please create an index that starts with the shard key before sharding."

所以我做了

db.c2.ensureIndex({LOG_DATE: 1})
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"})

相同的错误,但它显示了新索引。

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

为了确定,我跑了:

db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydb.c1", "name" : "_id_" }
{ "v" : 1, "key" : { "timestamp" : "hashed" }, "ns" : "mydb.c1", "name" : "timestamp_hashed" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns": "mydb.c2", "name" : "_id_" }
{ "v" : 1, "key" : { "LOG_DATE" : 1 }, "ns" : "mydb.c2", "name" : "LOG_DATE_1" }

我在admin上再次尝试相同的命令,但失败并出现同样的错误。

然后我尝试了没有“哈希”的管理员而且它有效。

db.runCommand({shardCollection: "mydb.c2", key: {"LOG_DATE": 1}})

问题:现在我的集合在没有哈希的东西上被分片,我无法改变它(错误:“已经分片”)

  1. 我做了什么错了?
  2. 我该如何解决这个问题?
  3. 提前致谢

    托马斯

1 个答案:

答案 0 :(得分:8)

最初的问题是你没有散列索引,你建议用于分片,这是错误信息。在第一条错误消息之后,当您创建了

索引时
{
    "v" : 1,
    "key" : {
        "LOG_DATE" : 1
    },
    "ns" : "mydb.c2",
    "name" : "LOG_DATE_1"
}

你仍然只有一个不是哈希的普通索引。如果你这样做:

db.c2.ensureIndex({LOG_DATE: "hashed"})

而不是:

db.c2.ensureIndex({LOG_DATE: 1})

比将是一个哈希指数。正如您在其他集合上的db.system.indexes.find()输出中所看到的,您有一个时间戳的散列索引,我假设这是该集合的分片键。

因此,如果c2集合中没有数据:

db.c2.drop()
db.createCollection('c2')
db.c2.ensureIndex({LOG_DATE: "hashed"})
sh.shardCollection("mydb.c2", {"LOG_DATE": "hashed"})

这将正常工作。