Как MongoDB оценивает несколько $ или операторов? - PullRequest
3 голосов
/ 16 марта 2012

Как MongoDB оценит этот запрос:

db.testCol.find(
{
    "$or" : [ {a:1, b:12}, {b:9, c:15}, {c:10, d:"foo"} ]
});

При сканировании значений в документе, если первый оператор OR равен TRUE, будут ли оцениваться и другие операторы?

Логически, если MongoDB оптимизирован, другие значения в операторе OR не должны оцениваться, но я не знаю, как реализован MongoDB.

UPDATE: Я обновил свой запрос, потому что он был неправильным и не объяснял правильно, что я пытался выполнить. Мне нужно найти набор документов, которые имеют разные свойства, и, если будет найдена комбинация этих точных , документ должен быть возвращен.

SQL-эквивалент моего запроса:

SELECT * FROM testCol 
WHERE (a = 1 AND b = 12) OR (b = 9 AND c = 15) OR (c = 10 AND d = 'foo'); 

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

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

Другими словами, он НЕ будет смотреть на 1 документ, посмотреть, какое из предложений OR применимо, и сделать раннее, если первое предложениеэто матч.Скорее, он выполняет полный набор запросов к каждому предложению и восстанавливает после него факт.Это может показаться менее чем эффективным, но на практике это почти всегда быстрее, так как первый подход мог бы достичь только одного индекса для всех предложений, который редко эффективен.

1 голос
/ 16 марта 2012

РЕДАКТИРОВАТЬ: Mongo пропускает документы только в процессе дедупликации, а не во время сканирования таблицы.

Mongo не будет проверять документы, которые уже являются частью набора результатов.Поэтому, если ваш первый {a: 1, b: 12} вернет 100% документов, Mongo готово.

Вы хотите поместить все, что захватит большинство документов, в качестве вашего первого оцененного утверждения.Если ваш первый элемент захватывает только 1% документов, последующий элемент должен будет отсканировать остальные 99%.

При этом вы используете $ или для поиска значений в одном ключе.Я думаю, что вы хотите использовать $ in для этого.

Смотрите здесь для получения дополнительной информации:

http://books.google.com/books?id=BQS33CxGid4C&lpg=PA48&ots=PqvQJPRUoe&dq=mongo%20tips%20and%20tricks%20%22OR-query%22&pg=PA48#v=onepage&q&f=false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...