В изолированном кластере маршрутизатор mongos определяет, какой шард должен быть предназначен для операции чтения или записи, на основе доступных метаданных ключа шарда, хранящихся на серверах конфигурации.
Для вставки либо Sharding Key будет равномерно распределять документы по кластеру, не имеет значения, какое поле я использую в качестве Sharding Key.
При вставке документа он будет иметь ключ шарда, и документ будет сохранен для указанного сегмента.
Поле (1) обычно является частью условия фильтра запроса, поэтому запрос будет обрабатываться обычно только для одного сегмента.
Шард Основными задачами ключа являются (а) равномерное распределение данных по сегментам в кластере и (б) возможность запроса данных таким образом, чтобы запрос предназначался для одного сегмента.
Чтобы запрос был нацелен на один шард, ключ шарда должен быть частью критериев фильтра запроса. Маршрутизатор mongos нацелится на один осколок, используя ключ осколка.
Если ключ осколка не является частью критериев фильтра, это будет операция разброса (длительный запрос). Важно, чтобы наиболее важные операции запроса приложения, использующего сегментированный набор, могли использовать ключ сегмента.
Поле (2) обычно не является частью условия фильтра запроса, поэтому запрос будет обрабатываются для всех сегментов, и, как правило, несколько фрагментов вносят свой вклад в конечный результат запроса.
Когда ключ сегмента не является частью фильтра запроса, операция будет охватывать несколько сегментов (операция разброса-сбора). ) и это будет медленная операция. Маршрутизатор Mongos не сможет определить, какие шарды содержат целевые данные, и все шарды в кластере будут запрошены для получения окончательного результата.
Какой из полей лучше использовать как ключ шардинга?
Можно сделать вывод, что поле (1) должно использоваться как ключ шарда.
См. документацию по ключам шарда и выбору ключа шарда @ Документы MongoDB на Shard Keys .