почему команда shardCollection не работает в сценарии оболочки mongo

Я пытаюсь выполнить следующую команду в сценарии оболочки mongo:

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

но это ничего не делает.

Однако, когда я выполняю скрипт:

print(sh.help())

Я получаю все варианты помощи.

Таким образом, переменная 'sh' также доступна в сценарии оболочки mongo.

тогда почему я не могу выполнить shardCollection через сценарий оболочки mongo?

РЕДАКТИРОВАТЬ: Спасибо Нилу за его комментарии. Вот мой сценарий оболочки монго.

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 не работает.


person codeofnode    schedule 13.09.2014    source источник
comment
Прочтите документацию и определите, что вы делаете. неправильно здесь.   -  person Neil Lunn    schedule 13.09.2014
comment
Я делаю то же самое, что указано в документации. Не могли бы вы указать, что я делаю неправильно.   -  person codeofnode    schedule 13.09.2014
comment
Что такое shardKey для начинающих? Не отвлекайтесь от вопросов, на которые действительно хотите получить ответы. Покажите свой образец документа, покажите свою настоящую команду, покажите свою фактическую ошибку. При нынешнем 1200 повторениях вы уже должны это знать, но не сделали ничего из того, что разумно нужно.   -  person Neil Lunn    schedule 13.09.2014
comment
я обновил свой вопрос. Я сопоставил свою команду с документацией. Никакой разницы я не нашел. я до сих пор не могу найти причину, по которой мой скрипт не работал для команды sh.shardCollection.   -  person codeofnode    schedule 13.09.2014


Ответы (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/

person John Petrone    schedule 13.09.2014