2015-09-04 3 views
0

Кто-нибудь знает, имеет ли MongoDB ограничения на количество совпадений, которые могут быть указаны с помощью оператора «$ in»?

Например,

db.inventory.find({ _id: { "$in": [ "abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz" ] } }) 

Это "$ в" массиве матч состоит из 9 строк.

Могу ли я иметь 20, 30, сто или даже тысячи элементов массива с запросом спецификатора оператора $ in? Очевидно, что производительность может быть достигнута за счет огромных запросов, но просто интересно, создаст ли MongoDB ошибку, если «$ in» соответствует огромному массиву.

Спасибо.

Ps- Мой вопрос касается самого запроса, а не того, сколько результатов возвращается.

+0

спасибо. Трудно было найти ответ, потому что слово «in» слишком распространено. –

ответ

2

Единственным введенным «пределом» является BSON limit which is 16MB для всего документа, который представляет собой как комбинированное содержимое запроса, так и командную команду, отправляемую по проводу на сервер. Таким образом, это не только аргументы $in, но и фактор их «типа» и других компонентов запроса и самих компонентов команд. Последняя часть относительно небольшая.

Любое другое ограничение будет таким, что «массивы» обрабатываются вашей реализацией на родном языке, что может налагать собственный лимит на количество элементов.

Естественно, что управление длинными списками для соответствия в любом коде, как правило, громоздко и не очень хорошо для производительности, поэтому вы должны знать, что, вероятно, будет точка, в которой более высокая производительность будет достигнута путем «ограничения» вашего $in для небольших фрагментов списка, а не для всех сразу.

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

+0

Как вы пришли к выводу о _300 записей за запрос_? Почему 300? –