Одинаковые осколки в разных коллекциях MongoDB - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть коллекция A, содержащая документы одного типа, и вторая коллекция B, содержащая документы другого типа.

В коллекции B имеется несколько документов, имеющих одинаковое значение для поля "b", котороессылается на поле "a" в коллекции A.

Если мы разделим две коллекции A и B на "a" и "b" соответственно, можем ли мы быть уверены, что документы в коллекции A, имеющие "a = foobar"будет совмещен с документами в коллекции B, имеющими "b = foobar"?

1 Ответ

0 голосов
/ 15 декабря 2018

Если мы разделим две коллекции A и B на «a» и «b» соответственно, можем ли мы быть уверены, что документы в коллекции A, имеющие «a =», будут совмещены с документами в коллекции B, имеющими"b = foobar"?

Индексы ключей Shard определены для каждой коллекции, и (как в MongoDB 4.0) коллекции сбалансированы независимо.Даже если две коллекции имеют идентичные ключи сегментов, определенно нет гарантии, что диапазоны блоков или назначения сегментов будут выровнены.

Если вы планируете использовать запросы на стороне сервера для объединения данных из этихколлекции, использующие $lookup или $graphLookup, обратите внимание, что дополнительные коллекции, из которых вы просматриваете, в настоящее время не могут быть закрыты.Для этого варианта использования вы бы осколили только одну из коллекций.Для поддержки поиска с помощью теневого поиска в трекере проблем MongoDB есть некоторые важные улучшения: SERVER-29159 (sharded $lookup) и SERVER-27533 (sharded $graphLookup).

Существует несколько возможных подходов к совмещению данных, но у всех есть предостережения:

  • Денормализация: дублирование наиболее часто используемых полей из A в B.Это может ускорить извлечение данных, устраняя необходимость в объединениях, но добавляет некоторые накладные расходы для обновлений и хранения данных.
  • Внедрите связанные данные , чтобы у вас была отдельная коллекция.Это не будет идеальным вариантом, если ваши коллекции имеют очень разные модели роста или доступа или большое отношение один ко многим.
  • Управление распределением данных вручную: отключение балансировки для этих коллекций,вручную разделить (или предварительно разделить) фрагменты , чтобы диапазоны фрагментов были идентичны, и использовать разделение на зоны для привязки к фрагменту.

Для получения дополнительной информации об отношенияхпаттерны, блог серии Шесть практических правил для разработки схемы MongoDB - это полезное чтение.Он не распространяется на шардинг, но общие принципы модели данных по-прежнему применимы.

...