2016-08-21 6 views
1

Ниже приведен упрощенный вариант документа в моей базе данных:Лучший ключ осколок (или оптимизированный запрос) для запроса диапазона на поддокументе массиве

{ 
    _id : 1, 
    main_data : 100, 
    sub_docs: [ 
     { 
      _id : a, 
      data : 100 
     }, 
     { 
      _id: b, 
      data : 200 
     }, 
     { 
      _id: c, 
      data: 150 
     } 
    ] 
} 

Итак, представьте, у меня есть много этих документов с различными значениями данных (скажем, 0 - 1000). В настоящее время мой запрос что-то вроде:

db.myDb.find(
    { sub_docs.data : { $elemMatch: { $gte: 110, $lt: 160 } } } 
) 

Есть ли ключ осколка я мог бы использовать, чтобы помочь этому запросу? В настоящее время он запрашивает все осколки. Если нет лучшего способа структурирования моего запроса?

ответ

1

Джексон,

Вы думаете об этой проблеме на правильном пути. Проблема с широковещательными запросами в MongoDB заключается в том, что они не могут масштабироваться.

Любой запрос MongoDB, который не фильтрует ключ осколка, будет передаваться всем черепашкам. Кроме того, запросы диапазона, вероятно, вызовут трансляции, по крайней мере, для того, чтобы ваши запросы были отправлены на несколько осколков.

Так вот некоторые вещи, чтобы думать о

  • Частота запроса - Является ли запрос диапазон ваш самый частый запрос? Ожидаемая рабочая нагрузка ?
  • Range Logic - Есть ли какая-либо логическая логика, как вы собираетесь делать применять диапазоны? Скажем, вы сказали бы, что 0-200 мал, 200 - 400 - средний. Вы могли бы добавить еще одно поле в свой документ и обложить его.
  • Дополнительные кандидаты на осколки ключа. Иногда есть другие поля , которые могут быть включены во все или большинство ваших запросов, и это будет обеспечить хорошее распространение. Объединив фильтрацию с вашим диапазоном запросов, вы можете ограничить свой запрос одним или несколькими осколками.
  • Разделите массив. Вместо этого вы можете иметь несколько документов вместо массива. В этом случае у вас будет несколько документов, один для . Каждое вхождение массива и основных данных будет дублироваться через документов с несколькими заголовками. Диапазон запросы по этому вопросу по-прежнему будут проблемы, но вы могли бы включать в себя несколько черепков, не обязательно все (это зависит от ваших демографических данных и шаблонов запросов)

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

Один из последних советов - быть осторожным с вашими шаблонами запросов вставки/обновления, если вы планируете часто обновлять свой документ, чтобы добавить больше записей в массив. Growing documents present scaling problems for MongoDB. See this article on this topic.

+0

Благодарим вас за то, что нашли время, чтобы поделиться всей этой информацией. Все это очень полезно даже вне первоначальной сферы вопроса. Я думаю, что я попытаюсь использовать другой ключ осколка для своих данных (или составной ключ). –

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

  • Нет связанных вопросов^_^