НЕ В (ВЫБРАТЬ * ОТ X) эквивалент для MongoDB - PullRequest
0 голосов
/ 05 мая 2011

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

Так, например, представьте следующие объекты (упрощенные, чтобы сделать это более читабельным):

person { _id: 1, name: 'Matt', previouslyMatched: [2] }

person { _id: 2, name: 'John', previouslyMatched: [1] }

person { _id: 3, name: 'Tony', previouslyMatched: [] }

Я хочу выполнить запрос к Мэтту (id: 1), чтобы выяснить, есть ли какие-либо другие записи о персонале, которых нет в массиве ранее.

Теперь в SQL я бы так что-то вроде SELECT ID FROM person WHERE ID <> 1 AND ID NOT IN (SELECT match_id from person_match where person_id = 1) конечно, при условии, что у меня есть таблица поиска person_match со столбцами person_id и match_id, в которой хранятся все предыдущие совпадения. Я понимаю, что в этом запросе есть потенциальные ошибки производительности, но, пожалуйста, потерпите меня, так как это всего лишь пример, и будут сделаны другие оптимизации.

В MongoDB просто не ясно, как бы я поступил так. Я, конечно, мог бы получить документ о человеке (id: 1), затем получить все документы о людях и проверить, находится ли идентификатор в массиве beforeMatched на стороне клиента, но меня беспокоит снижение производительности из-за неоправданно большого размера передача данных клиенту с сервера БД.

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

Мои интуитивные ощущения говорят мне, что ответ может заключаться в Выполнение кода на стороне сервера , но мне не ясно, как этого достичь.

Наконец, меня также беспокоит, сколько элементов можно хранить практически в одном поле массива. Есть ли практический предел?

Спасибо, Matt

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Похоже, вы пытаетесь присоединиться здесь.Это не совсем соединение, но синтаксис SQL IN позволяет эффективно применять вывод одного набора данных к другому.

В любом случае MongoDB не поддерживает объединения и не поддерживаетWHERE IN (subtable) синтаксис.Упомянутый вами синтаксис $in эквивалентен WHERE IN (a,b,c) с фиксированным списком.

Единственные методы, которые я здесь вижу, включают несколько запросов (2 или более) или некоторую форму обработки на стороне клиента.

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

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

Наконец, меня также беспокоит, сколько элементов может храниться в одном массиве.поле практически.Есть ли практический лимит?

Документ MongoDB может содержать только 16 МБ данных.Это жесткий физический предел.

64-разрядное целое число занимает 8 байт .Это пара миллионов дюймов.Очевидно, что для строк это намного меньше.

Мое личное правило - тысячи или десятки тысяч (в зависимости от данных).Если вам нужно хранить «сотни тысяч» , вы, вероятно, столкнетесь с этим пределом в 16 МБ.

0 голосов
/ 05 мая 2011

Вы должны выполнить несколько запросов ... нет ничего подобного Sub-Select в MongoDB или выполнить некоторую явную фильтрацию на стороне приложения.

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