我正在尝试在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
无效。
答案 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