LINUX.ORG.RU

Many-to-many в одной коллекции в монге

 ,


0

2

Подскажите как можно удобно в монге реализовать такую штуку: если пачка объектов (на уровне бизнес-логики, не базы), которые имеют поля to и from. Поля - массивы id таких же объектов, при этом связанные: добавление нового ID в to объекта A должно быть зеркально отражено в from объекта Б. По частоте запросов поле to нужно сильно чаще, поле from видят не все.

В данный момент сделал так: каждый элемент в базе имеет только поле to, а from считается агрегацией через поля to других записей. Плюсы - просто, консистентно. Минусы - хз как в один запрос к базе сделать update+get чтоб вернуть from, и вот как раз в update его возвращать нужно на уровне API. Пока сделано так - update+get достаёт to, дальше from приходит сбоку перед отправкой фронтенду. Плюс в апдейте идут два запроса - update+get на объект плюс bulk update на связанные объекты (добавление+удаление). Можно конечно все сделать в один update, но он значение не возвращает, и имхо мутирующий метод для одного элемента должен возвращать изменённый объект.

Подскажите как сделать лучше? В целом update не так чтоб часто использовали, так что может быть over-engineering. Думал про aggregate+merge, но это выглядит диким костылем

★★★★★

Последнее исправление: upcFrost (всего исправлений: 1)

в couchdb я-бы раскладывал отдельно объекты,и отдельно их связи (по разным коллекциям). Так её индексы вроде как лучше работают. В монге должно быть так-же. С другой стороны это SQL-ная привычка ;-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

А потом два апдейта пачкой и пара lookup в aggregate? Такое себе, плюс становится неочевидно без подзапроса есть ли связанные объекты или нет. Если можно делать поля-списки и индекс по ним имхо лучше вместе держать. По крайней мере для наиболее частых запросов, скажем в сабже to будет выбираться натурально на каждый запрос фронтенда, а from - только в особых случаях

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от urxvt

Так в Монге же транзакции есть

Транзакция не отменяет пачку round-trip, плюс транзакции не лочат записи. По факту несколько записей разом в монге ничто не лочит, но с одним round-trip окно когда можно словить race condition сильно меньше. Есть bulk write, но он именно write, а не read, результат не возвращает.

upcFrost ★★★★★
() автор топика