MongoDB Schema Design, Coalesce, объединение пользовательских полей с полями по умолчанию - PullRequest
2 голосов
/ 08 июля 2011

Дано:

База данных объектов, каждый из которых имеет взвешивание по умолчанию для порядка поиска (возможно, универсальный рейтинг популярности).

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

В SQL это довольно легко сделать, объединяя объекты и таблицы user_objects и делая что-то вроде

select ... coalesce(user_objects.personal_weighting, objects.default_weighting) 
    as sort_key order_by sort_key

Другими словами, пользователь может искать всю базу данных объектов (например, песни).Если есть объект, с которым пользователь никогда ранее не взаимодействовал (песня, которую он никогда не слушал), тогда весовое значение порядка поиска для этого объекта основывается на значении по умолчанию, сохраненном для каждого объекта.Если пользователь взаимодействовал с объектом, тогда весовые коэффициенты порядка поиска этого объекта основаны на весовых коэффициентах конкретного пользователя, переопределяя значение по умолчанию.

Есть ли эффективный способ моделирования этого в MongoDB?Было бы довольно легко и эффективно использовать map / lower в CouchDB из-за индексов, хранимых для карты / уменьшенных видов, но я не понял, как это сделать в MongoDB.

Есть идеи?

1 Ответ

0 голосов
/ 08 июля 2011

Я думаю, что единственным способом сделать это масштабируемым является следующее:

Создайте отдельную коллекцию для каждого пользователя, которая содержит только вес для посещенных объектов.Добавить индекс.Затем получите верхний взвешенный ObjectIds + вес из этой коллекции.Получите веса ObjectIds + для наиболее взвешенных элементов из вашей исходной коллекции.Объедините эти два списка и, наконец, получите нужные элементы.

Все запросы проиндексированы, поэтому это должно быть быстро.Код нумерации страниц для набора результатов является более сложным (шаг слияния) и не будет работать быстро, если ваши пользователи захотят проверить не только ... скажем, 50-ю страницу или около того (просто отключите ее, как в Google).

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