为什么shardCollection命令在mongo shell脚本中不起作用

时间:2014-09-13 08:55:19

标签: mongodb sharding mongo-shell

我正在尝试在mongo shell脚本中执行以下命令:

sh.shardCollection('mydb.collection', { shardKey : 1 });

但它没有做任何事情。

但是当我从脚本执行时:

print(sh.help())

我得到了所有帮助选项。

因此在mongo shell脚本中也可以使用'sh'变量。

那么为什么我不能通过mongo shell脚本执行shardCollection?

编辑:感谢neil的评论..这是我的mongo shell脚本

db = connect("mydb");
print(db.help());

var cols = db.getCollectionNames();

var names = [
  'a',
  'b',
  'c'
];


var forEachCol = function(i){
  if(i === cols.length) return print('Sharding on collections Succesfull');
  if(names.indexOf(cols[i]) !== -1) {
    sh.shardCollection(cols[i], { shardKey : 1 });
  }
  forEachCol(i+1);
};

forEachCol(0);

每个集合a,b,c中的每个文档都有一个字段'shardKey'(带索引)。因此'shardKey'有助于在一个碎片上保留具有特定shardKey的文档。

现在当我去mongo shell并运行

db.printShardingStatus()

我得到输出为

{  "_id" : "mydb",  "partitioned" : false,  "primary" : "shard0000" }

和分片,这里没有列出任何集合。 表示sh.shardCollection无效。

1 个答案:

答案 0 :(得分:0)

您使用的命令不正确。正确的用法是传递sh.shardCollection()数据库和集合的名称以及描述分片键的文档。例如:

sh.shardCollection("myDatabaseName.MyCollectionName", {"myshardkey":1})

将名称空间命名为数据库名称和由句点分隔的集合名称的组合。 shardkey文档应该是要用作分片键的集合中的键。如果您希望对分片键进行哈希处理,则可以使用{"myshardkey":"hashed"}代替。

请注意,您的脚本无法按设计运行。为了对您的集合进行分片,您需要传入所需的分片键,这通常不会是循环通过所有集合的脚本将能够自动确定。有时它会是“_id”,但有时会是另一个字段或字段组 - 这一切都取决于你选择用作密钥的内容。

我强烈建议你阅读一般的分片 - 这样做并不是一个简单的过程。

http://docs.mongodb.org/manual/reference/method/sh.shardCollection/#sh.shardCollection

http://docs.mongodb.org/manual/core/sharding-introduction/