Что означает: «Не могу изменить значение поля ключа ключа для коллекции: foo.foo» в MongoDB-Perl? - PullRequest
6 голосов
/ 10 августа 2011

У меня есть коллекция foo.foo:

db.runCommand( { shardcollection: "foo.foo", key: { id: 1 } } );

Когда я делаю упертку какого-то документа:

$connection->update(
    { id => 42 },
    { '$set' => { id => 42 } },   # using the '$set' modifier
    { upsert => 1, safe => 1 },
);

Я получаю это исключение:

Can't modify shard key's value fieldid for collection: foo.foo

Если я сделаю upsert без модификаторов:

$result = $collection->update(
    { id => $args{doc_id} },
    { id => 42 },                 # regular upsert without modifier
    { upsert => 1, safe => 1 },
);

Я получаю эту ошибку:

cannot modify shard key for collection: foo.foo

Но когда я вместо этого осколок:

# 'id' has been changed to '_id'
db.runCommand( { shardcollection: "foo.foo", key: { _id: 1 } } );

Затем, когда я выполняю тот же переход, что и выше, я получаю следующее исключение:

can't upsert something without shard key

Что такое "shard key's value fieldid"?

Почему я не могу сделать upsert, который устанавливает "id" с модификаторами или без, как показано в первых 2 примерах?

В любом случае вставки работают нормально. Это возражает, которые бросают исключения.

Ответы [ 2 ]

12 голосов
/ 10 августа 2011

Две вещи:

  1. Ключи шарда являются неизменными. Как только вы установите их, они не могут быть обновлены. Это имеет смысл, потому что это может привести к перемещению данных из одного сегмента в другой. Таким образом, обновление, включающее поля, которые являются (или являются частью) ключом шарда, завершится с ошибкой, которую вы получаете. Первые два сообщения об ошибке - это одна и та же ошибка.

  2. Вы не можете делать вставки в коллекцию с осколками без ключа осколка. Опять же, это имеет смысл с точки зрения Монго. Если вы не предоставляете ключ осколка, как он узнает, к какому осколку следует направить вставку? Поэтому операция upsert должна включать ключ shard в «критерии» поиска (то есть первый параметр в update(criteria, update, upsert, multi)), а не «update», поскольку это единственный правильный способ получить ключ shard в перенесенном документе, не имея его в параметре "update", который, как вы заметили, недопустим.

Имеет смысл?

1 голос
/ 17 ноября 2011

Я думаю, что ответом на этот вопрос является ошибка в mongodb 2.0. Проверьте эту проблему Jira:

https://jira.mongodb.org/browse/SERVER-3657

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...