Хорошо, это выглядит довольно хорошо. Давайте построим некоторые из запросов.
Предполагается, что коллекции именуются пользователями, событиями, местами проведения:
Вставить несколько фиктивных событий :
db.events.insert ({теги: [ "удивительный", "весело", "круто"]})
db.events.insert ({теги: [ "сладкий", "весело", "рад"]})
Сделать индекс (как у босса)
db.events.ensureIndex ({теги: 1})
Список различных тегов (это может быть сложно, учитывая текущий дизайн) :
Нет, не сложно.
db.events.distinct ( "метка")
["круто", "круто", "весело", "рад", "сладко"]
События в данном теге (вы имели в виду «с данным тегом», верно?)
db.events.find ({tags: "fun"})
{"_id": ObjectId ("4ecc08c62477605df6522c97"), "tags": ["awesome", "fun", "cool"]}
{"_id": ObjectId ("4ecc08d92477605df6522c98"), "tags": ["sweet", "fun", "rad"]}
Информация о событии вместе с местом проведения
Вы можете сделать это несколькими разными способами. Одним из способов будет запрос о событии и последующий запрос места. С обоими документами объедините (объедините) нужные данные вручную.
OR
Вы можете немного денормализовать и сохранить кэшированные названия мест + месторасположения (но не детали места, такие как часы работы, максимальная занятость, веб-сайт, номер телефона и т. поставляется со стандартным предупреждением о денормализации, заключающимся в невозможности обновления ваших данных в одном месте.
Вся информация о событии и месте проведения определенного события
См. Выше
Все события рядом со мной. Нужно использовать географический указатель на loc
Снова два запроса, та же концепция, что и выше, только в обратном порядке.
Получить места проведения:
db.venues.find ({loc: {$ near: [lat, lon]}})
Получить события, используя идентификаторы места проведения:
db.events.find ({место проведения: {$ in: [id1, id2, id3 ...]}})
Некоторые из этих вещей могут быть выполнены автоматически для вас, если вы используете ODM.
Удачи!