【问题标题】:why shardCollection command not working in mongo shell script为什么 shardCollection 命令在 mongo shell 脚本中不起作用
【发布时间】:2014-09-13 08:55:18
【问题描述】:

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

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

但它什么也没做。

但是当我从脚本执行时:

print(sh.help())

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

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

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

编辑:感谢 neil 的 cmets.. 这是我的 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 不工作。

【问题讨论】:

  • 阅读the documentation 并找出你在这里明显做错了什么。
  • 我正在做与文档中提供的相同的事情。你能指出我做错了什么吗?
  • 什么是初学者的“shardKey”?不要抽象出你真正想要答案的问题。显示您的示例文档,显示您的真实命令,显示您的实际错误。在当前的 1200 次代表中,您现在应该知道这一点,但没有做任何合理需要的事情。
  • 我更新了我的问题。我将我的命令与文档相匹配。我没有发现任何区别。我仍然找不到我的脚本不能用于命令 sh.shardCollection 的原因。

标签: mongodb sharding mongo-shell


【解决方案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/

【讨论】:

    最近更新 更多