Подтвердить что ты не робот

Mongo $в работе оператора

Является ли медленная/плохая форма использовать оператор $in в MongoDB с большим количеством возможностей?

posts.find({
    author : {
        $in : ['friend1','friend2','friend3'....'friend40'] 
    }
})

App Engine, например, не позволит вам использовать более 30, потому что они переводят непосредственно на один запрос на элемент в массиве IN, и вместо этого вместо этого вы используете свой метод для обработки отключить. Хотя это, вероятно, самый эффективный метод в Монго, код для него значительно сложнее, поэтому я бы предпочел просто использовать этот общий метод.

Будет ли Mongo эффективно выполнять эти $в запросах для наборов данных разумного размера?

4b9b3361

Ответ 1

Он может быть довольно эффективным с небольшими списками (трудно сказать, что мало, но по крайней мере в десятки/сотни) для $in. Он не работает, как приложение-движок, поскольку mongodb имеет фактические индексы btree и не является хранилищем столбцов, например bigtable.

С помощью $in он будет пропускать в индексе, чтобы найти соответствующие документы, или пройти через всю коллекцию, если нет индекса для использования.

Ответ 3

Предполагая, что вы создали индекс в поле author, с алгоритмической точки зрения временная сложность операции $in: $(N*log(M)), где N - длина входного массива, а M - размер коллекции.

Временная сложность операции $in будет не изменяться, если вы не измените базу данных (хотя я не думаю, что любой db может сломать O(N*log(M))).

Однако, с технической точки зрения, если N переходит на большое число, лучше разрешить серверу вашей бизнес-логики имитировать операцию $in либо пакетным, либо одно за другим.

Это просто потому, что: память на серверах баз данных более ценна, чем память на серверах бизнес-логики.