Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Критерии примерно следующие:
- (Самый важный) какие запросы вы будете делать. Данные, которые в
SQL присоединяются джойнами, можно складывать внутрь документа, для
которого они вам нужны.- (Похож на первый) отображение. Какие данные вы хотите показать
вместе с этим объектом? Их и надо пихать внутрь него. Идеальный
вариант в вакууме: одна страница интерфейса — один и только один
документ.- Как вы будете вставлять и модифицировать данные. Тут важно нужно ли
вам в каком-то месте обеспечить транзакционность.- Масштабируемость. Здесь важен выбор ключа шардинга, но его можно
впихнуть потом отдельным полем (если данных будет не слишком много),
но можно и сразу завести отдельное поле, например, «shkey», и уже
писать в него что-нибудь осмысленное. Так легче будет поменять логику
шардинга в будущем.
Я собираюсь использовать MongoDB для сбора диагностических данных c промышленных объектов. Основная сущность — пром.объект. У этого объекта есть такие характеристики, как: принадлежность к стране, региону, предприятию, филиалу этого предприятия, эксплуатирующей организации, которая находится в подчинении у филиала, географическое положение и.т.п. В реляционной модели я бы сделал все это в разных таблицах. А как лучше сделать в MongoDB? Плюсом в БД будут стекаться динамические данные с этих пром.объектов, примерно раз в секунду что-то типа среза всех данных по объекту.
user.find({'memberships.group':42}, {'memberships.adress':1})
> db.user.insert({ name:'Jo', memberships:{ 1:{ email:'x@y', grname:'blabla' }, 5:{ email:'Jo@gmail', grname:'for me' } } })
> db.user.insert({ name:'Jo2', memberships:{ 2:{ email:'x@y', grname:'blabla' }, 5:{ email:'Jo2@gmail', grname:'for me2' } } })
> db.user.insert({ name:'Jo3', memberships:{ 2:{ email:'x@y', grname:'blabla' }, 4:{ email:'Jo3@gmail', grname:'for me3' } } })
> GROUP = 5
> query = {}
> query['memberships.'+GROUP] = { $exists:true }
> fields = {}
> fields['memberships.'+GROUP] = 1
> db.user.find(query, fields)
{ "_id" : ObjectId("4fc50d81151b7c848b19d110"), "memberships" : { "5" : { "email" : "Jo@gmail", "grname" : "for me" } } }
{ "_id" : ObjectId("4fc50ee1151b7c848b19d111"), "memberships" : { "5" : { "email" : "Jo2@gmail", "grname" : "for me2" } } }
user.find({'a.b':42}, {'b.c':1})user.ensureIndex({'a.b':1, 'b.c':1})
cannot index parallel arrays [b] [a]
Моделирование данных в MongoDB