2014-09-13 119 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/