2014-09-13 48 views
0

我试图蒙戈shell脚本中执行以下命令不工作:为什么shardCollection命令蒙戈shell脚本

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

但它不会做任何事情。

然而,当我从脚本执行:

print(sh.help()) 

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

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

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

编辑:感谢尼尔他的评论。这里是我的蒙戈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的文档。

现在,当我去蒙戈外壳和运行

db.printShardingStatus() 

我得到的输出

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

和分片对没有收藏在这里被列出。 表示sh.shardCollection无法正常工作。

+0

阅读[文件](http://docs.mongodb.org/manual/reference/method/sh.shardCollection/#example),并制定出你都清楚做什么这里错了。 – 2014-09-13 08:59:31

+0

我正在做与文档中提供的相同的事情。你能指出我在做什么错吗? – codeofnode 2014-09-13 09:16:36

+0

什么是初学者的“shardKey”?不要从你实际想要的答案中抽象出来。显示您的示例文档,显示您的真实命令,显示您的实际错误。在目前的1200名代表你应该知道这一点,但没有做任何明智的需要。 – 2014-09-13 09:33:39

回答

0

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

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

将名称空间命名为由句点分隔的数据库名称和集合名称的组合。 shakeykey文档应该是您想用作分片键的集合中的关键字。如果你想分片键被散列,你可以使用{"myshardkey":"hashed"}来代替。

请注意,您的脚本无法按设计工作。为了分割你的集合,你需要传递所需的分片键,这通常不是一个循环的脚本,所有的集合都可以自动确定。有时它会是“_id”,但有时它会是另一个领域或一组领域 - 这一切都取决于您选择用作关键。

我强烈建议您阅读关于分片的文章 - 这并不是一个好的过程。

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

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