0

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

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

但它什么也没做。

但是,当我从脚本执行时:

print(sh.help())

我得到了所有的帮助选项。

所以意味着 'sh' 变量也可以在 mongo shell 脚本中使用。

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

编辑:感谢尼尔的评论.. 这是我的 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不工作。

4

1 回答 1

1

您使用的命令不正确。正确的用法是传递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/

于 2014-09-13T18:15:09.637 回答