MongoDB / MongoID специальный запрос для нескольких ключей - PullRequest
2 голосов
/ 25 апреля 2011

У меня есть две коллекции: новости и подписки. У каждой новости есть массив строк - «тегов». Каждая подписка также имеет такие «теги».

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

Когда я хочу получать новости подписки, я делаю такой запрос для Ruby MongoID:

NewsItem.where(:tags.all => @subscribe.tags)

Как я могу получить все подписки на некоторые новости?

Например:

item.tags = ["foo", "bar"]

subscribe1.tags = ["foo"]
subscribe2.tags = ["bar"]
subscribe3.tags = ["foo", "bar"]
subscribe4.tags = ["foo", "bar", "baz"]

item.subscribees должен давать подписки 1..3, но подписка 4 не должна быть включена, потому что у нее есть тег "baz", который не включен в item.tags

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Исходя из вашего описания, вы на самом деле не хотите $all. Вместо этого вы ищете какой-то оператор $subset. Для такой вещи существует запрос JIRA , однако в настоящее время он не реализован.

0 голосов
/ 25 апреля 2011

Вы должны выполнить сопоставление "при создании новостного элемента", поэтому вы выполняете эту операцию по требованию и часто.Переверните запрос и выполните

Subscriber.all_in(tags: news_item.tags)

, чтобы найти подписчиков, имеющих все теги новостного элемента.Это то, как вы хотели?

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

...