2016-06-17 4 views
0

У меня есть документы, как: {_id: "someid1", "bar": "somevaluebar1"} {_id: "someid2", "foo": "somevaluefoo2", "bar": "somevaluebar2"} {_id: "someid3", "foo": "somevaluefoo3", "zoo": "somevaluezoo3"} {_id: "someid4", "zoo": "somevaluezoo4"} MongoDB соединения осколка ключевой стратегия

1. Если мы запрашиваем документы от «Foo» самым «и бар» вторым, имеет смысл создать ключ соединения осколка как {"foo": 1, "bar": 1, "_id": 1}?

2. «foo» или «bar» также может отсутствовать в документе, поэтому я добавил «_id» к составному ключу осколка. Это хорошее решение?

3. Что произойдет, если я запрошу «бар»? Он попал во все осколки, чтобы собрать результат?

ответ

0

Важно понимать при создании ключей осколков, что они должны иметь различное свойство по сравнению с обычными ключами (первичными или вторичными). Обычно осколки группируют блоки данных, содержащие одинаковые значения ключа осколка (т. Е. Значения, находящиеся в определенном диапазоне). Таким образом, хороший ключ осколка не должен монотонно возрастать.

В случае сложного ключа осколка, так как он содержит поле «_id», он будет уникальным для каждого документа. Поэтому он делает плохой выбор для ключа осколка, поскольку все куски будут сброшены на один осколок. Эту проблему можно решить с помощью хэш-ключей следующим образом,

sh.shardCollection("<your-db>", {{ "foo" : 1, "bar" : 1, "_id" : 1 }:"hashed"})

Теперь, обращаясь к отдельным Вами вопросы. 1. Поскольку вы запрашиваете свои данные больше на «foo», чем «bar», имеет смысл сделать «foo» как ключ осколка. В случае, если «foo» равномерно распределено, его не нужно хэшировать.

  1. Вы можете редактировать поле «foo» с помощью некоторого фиктивного значения, тогда вам не нужно указывать «_id» в составном осколочном ключе. Однако, если число пустых полей «foo» велико, вы можете использовать ряд фиктивных значений.

  2. Если вы создаете только осколки, основанные на «foo», при запросе с использованием «бара» все осколки будут поражены, чтобы собрать результат.

tl; dr. Если частота операций на «foo» значительно выше, чем на «барах», а «foo» равномерно распределяет accorss все строки, foo может использоваться как ключ осколка, а фиктивные значения могут использоваться для заполните отсутствующие значения «foo».

+0

Я пробовал код, опубликованный выше, но получил ** синтаксическую ошибку **. Вот команда: 'db.test_collection.ensureIndex ({{"foo": 1, "bar": 1}: "hashed"})'. – angelokh

Смежные вопросы