yopp
я что-то все равно не понимаю, как мне разрешить вот такой случай с findAndModify
пришло — [{ id: 1, name: 'robert' }, { id: 3, name: 'aria' }]
есть — [{ id: 1, name: 'rob' }, { id: 2, name: 'john' }]
надо — [{ id: 1, name: 'robert' }, { id: 2, name: 'john' }, { id: 3, name: 'aria' }]
На каждую запись по одному findAndModify
Миша
yopp
Нет
yopp
Это не проблема
Миша
сервис мониторинга сходит с ума
yopp
От чего? Что не так?
yopp
Вы начали не с того конца
Миша
хм
yopp
Bulk вашу проблему не решит
yopp
Потому что вычислительная сложность от него не изменится.
Миша
здесь проблема в том, что сервис мониторинга просто не умеет батчить свои запросы
yopp
yopp
yopp
чтоб объеденить два множества, вам в любом случае потребуется сравнить все элементы из одного из множеств
yopp
вопрос только в том, какая вычислительная сложность будет у этого процесса
yopp
индекс по полю которое, которое используется для findAndModify и использование полного совпадения позволит сократить до O(N)
yopp
что такое «не справляется»?
yopp
покажите ваши запросы, покажите explain
Evgeny
заинтриговали, надо будет написать бенчмарки
yopp
бенчмарки чего?
yopp
на уровне логики, какие могут быть оптимизации?
Evgeny
есть еще реализация логики, говнокод никто не отменял
yopp
Причём тут говнокод. У вас есть три абстрактные операции A,B,C. Вы требуете от базы данных чтоб она вам что-то там оптимизировала, когда вместо последвательного выполнения, они объединяются в логическую группу
Nick
единственная известная мне оптимизация в булке - упорядоченное/не упорядоченное выполнение и вроде как второе может быть быстрее за счет параллельности. но это почти тоже самое, что выполнять запрос в тыщу потоков например
Evgeny
я все же верю цифрам и хочу видеть, что коллекция параллельных findAndModify() c upsert выдаст тот же результат, что и Bulk.find().upsert().update()
Nick
Bulk.find().upsert().update() что за ужасная конструкция? откуда она?
Nick
а оно отличается от https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/ ?
yopp
yopp
Bulk это операция _сетевой_ оптимизации
yopp
Вместо множества сообщений, вы посылаете одно большое
Ruslan
возможен ли поиск определенного значения (string) по всей базе?
Evgeny
Evgeny
судя по ее собщениям, она как раз в сеть и уперлась
Volodymyr
Ребят, привет.
У нас главная сущность аккаунт, в ней массив компаний, в компании массив клиентов, у клиента массив ордеров. Как это замоделировать на монго верно ?)
yopp
yopp
yopp
если вы всегда оперируете сущностью «компания» со всеми её дочерними структурами, может подойти хранение всего в одном документе, если это меньше 16мб
yopp
если дочерние структуры, такие как ордера или клиенты, используются обособленно, то наверное стоит разделить структуры по своим коллекциям
Volodymyr
@dd_bb У нас будет подтягиваться 1 Ордер, в нем 1 клиент и 1 компания
Volodymyr
@dd_bb Если по отдельности, то как документы связывать между собой, через reference ?
yopp
да, через reference
Volodymyr
@dd_bb если сделать все через reference, не выйдет та же самая реляционка?
yopp
даже если выйдет, то что в этом плохого?
Volodymyr
@dd_bb Просто тогда не совсем понятно, в каких случаях нужно использовать вложенные документы, а какие через референс. Понятно, что разница между референс и вложеностью в кол-ве запросов при подтягивании конкретного документа, но все равно, я пытаюсь смоделировать бд, и мне непонятно, после реляционки, как правильно моделировать на монго, чтобы получить профит от монго
yopp
профит от монго в том, что у вас полная свобода в степени нормализации/денормализации
yopp
вы можете хранить в одной коллекции аккаунты, в другой компании, в которых вложенны клиенты, а в третьей ордера
yopp
или можете хранить всё целиком
yopp
основная идея хранить так, как вы будете это потом читать
yopp
чтоб чтение было простым запросом
yopp
Volodymyr
@dd_bb Я работаю над SAAS продуктом. На данный момент, тенантный документ в базе будет Account.
По принципу SAAS-a, в каждом документе должен находится тенант, чтобы по нему делать поиск. Как в таких случаях принято моделировать структуру документов в монго?
yopp
сделайте поле в котором храните _id владельца ресурса и сделайте по нему индекс
yopp
мой совет: забейте на «правильную архитектуру» и делайте как вам удобно. сфокусируйтесь на том, чтоб клиенты начали вашим saas пользоваться. когда они начнут пользоваться, они неизбежно вскроют все ваши проблемы с архитектурой и вы будете знать что исправлять
yopp
сейчас ваши представления о «правильной архитектуре» будут на уровне ощущений :)
yopp
в монге нет каких-то железных правил
Volodymyr
Ну тогда на данный моменит я думаю что нам подойдет такая иерархия, Company -> List<Client> -> LIst<Order>, но проблема в том что, при поиске любого из этих документов мне нужно обязательно передавать accountId поле, следовательно из того что я понял, этот accountId нужно во всех этих доках добавиить как референсе
yopp
я бы не парился и хранил бы все сущности в своих коллекциях
yopp
добавил бы туда индексированный account_id и не трогал, пока не появятся проблемы
Volodymyr
Окей, спасибо за разъяснения.
Wizard
Привет, помогите пожалуйста разобраться с агрегацией. Есть 2 задачи:
1) в выборке заменить массив memberIds на members = memberIds.length
2) выбрать members из clubs, где clubs.directorId == id текущего пользователя, clubs.memberIds содержит массив искомых members._id
Wizard
Нужны похожие на sql join операции, не могу понять эту местную логику)
Dmitry
Wizard
Спасибо, нашёл
Hellomik
народ кто в курсе как скинуть картину и еще вместе с ним текст ?
Hellomik
из сервера
Hellomik
к клиенту
Eugene
Hellomik
ок щас поищую
Denys
всем привет. подскажите плз, правильно ли будет подключить socket и добавить его в глобальную переменную для пользования в других модулях?? типа global.io = require('socket.io').listen(server);
Anonymous
Привет, подскажите как решить ошибку конфликта полей при обновлении? Приходит документ с обновой, я им делаю $set и сразу же $currentDate: {lastUpdate: true} . Поле lastUpdate может прийти в обновлении, и тогда он ругается. Как мне насильно сделать добавление поля currentDate? есть где-ннибудь тут флаг force?
Nick
Nick
Nick
да лучше удалять, тогда вы будете контрлироват ьвремя, а не хз откуда оно к вам попало