Alexey
так это получается апдейт или просто запрос данных? с апдейтом наверное не получится сделать одним запросом, но получится создать модифицированный объект через агрегацию и потом его уже апдейтить… но это опять же жесть какаято
Dmitriy
это просто выборка
Nick
Только не помню можно ли так, пл крайней мере можно через умножение на минус один и все в сумму
Dmitriy
спасибо
Aleksandr
Привет, я не могу понять, в каком виде приходит ответ от сервера при запросе something.find((...)=>...и т.д. там массив с объектами или что?
Alexey
курсор
Alexey
всё конечно зависит от того откуда этот код, но всегда проще сделать ()=>{console.log(arguments)} и там будет ясно
yopp
@WillRun и @ruslux первое и последнее предупреждение
Anonymous
такой вопрос возник: как обратиться к полю, у которого ключ = пустая строка? "translations." - не работает, пишет "имя поля не может кончаться точкой"
Anonymous
объект выглядит как-то так: { translations: {"": "default"} }
Nick
объект выглядит как-то так: { translations: {"": "default"} }
И кто додумался такой ключ указывать? Тащите в код и там его пытайтесь найти
Anonymous
Додумались потому, что в Java Locale.ROOT это пустая строка
Nick
И лучше переделайте все, а то плходу у вас там может что угодно быть в качестве ключа, но не все сможете вот указывать в синтаксисе
Nick
Додумались потому, что в Java Locale.ROOT это пустая строка
Переделывайте так чтобы указывалось какоето дефолтное значение при использовании рута и обрабатывайте соответвующе обращение к полям
Nick
Или вообще откажитесь от затеи использовать не ключи из вашей схемы
Nick
Дальше чтоб советовать нужна специфика ваших данных
Anonymous
ок спс за со вет
Alexey
почему же нельзя то?
Anonymous
а.. не знаю. может быть тут версия MongoDB старая, завтра проверю
Alexey
на 4.0.5 все ок
Anonymous
а, ну я врубился: ок: db.testDataRow.aggregate([{$match: {"a.": "c"}}]) ошибка: db.testDataRow.aggregate([{$sort: {"a.": 1}}]) ошибка когда $sort делаю
Nick
А зачем единственная сортировка в агрегате если проще обычный файнд с сортировкой?
Alexey
db.hey.aggregate([ { $project: { "x": { $arrayElemAt:[{$objectToArray:"$hey"},0] } } },{ $project:{ x:"$x.v" } }, { $sort:{"x":1} } ]);
Alexey
от второго прожекта тоже лучше избавиться
Nick
db.hey.aggregate([ { $project: { "x": { $arrayElemAt:[{$objectToArray:"$hey"},0] } } },{ $project:{ x:"$x.v" } }, { $sort:{"x":1} } ]);
Ой чую получите очень странные ответы, т.к. Порядок полей в объекте а так же в результирующем массиве не фиксированы
Alexey
ну конечно без реальных объектов нормальную агригацию строить так себе дело
Alexey
Ой чую получите очень странные ответы, т.к. Порядок полей в объекте а так же в результирующем массиве не фиксированы
db.hey.aggregate([ { $project: { "x": { $arrayElemAt:[{ $filter: { input:{$objectToArray: "$hey"}, as:"i", cond:{ $eq:[‘$$i.k’,’’] } } },0] } } },{ $project:{ x:"$x.v" } }, { $sort:{"x":1} } ]);
Askhat
Ребят подскажите как лучше всего с датами работать учитывая часовые пояса в запросах?
Maxim
Хранить время двумя полями, utc и offset. Запрос переводить в utc, возвращать уже с таймзоной
Askhat
Приводи все к одному поясу и работай
А если нужно отправить например уведомление в определенное время учитывая пояса всех пользователей?
Alexey
https://docs.mongodb.com/manual/reference/operator/aggregation/dateToParts/
Alexey
собираешь дату из частей, и сравниваешь надо ли высылать письма
Nick
А если нужно отправить например уведомление в определенное время учитывая пояса всех пользователей?
Содаете отдельное поле с временем отправления в вашем часовм поясе, при создании задачи вычисляете какое у вас будет время и не пар тесь насчёт тайм зон. А если сильно надо их хранить то заводите еще два поля локальное время пользователя и его таймзона. Но работаете со своим полем, а те два только для отобрадения и отчетов
Egor
Добрый день. Подскажите пожалуйста, я хочу импортировать в коллекцию (через коннектор pymongo) список словарей таким образом, чтобы на уровне бд проводить проверку - чтобы импортировало только те значения, которых в коллекции нет
Egor
я понимаю как организовать такую проверку при помощи питона, но полагаю что это создало бы кучу лишних коннектов и дополнительную нагрузку
Egor
предполагаю что можно на уровне инсерта провести подобную выборку средствами бд
Nick
спасибо
Только апсерт проапдейтит все дублирующиеся записи, если очень много данных, то может аффектить диски
Nick
Всеравно нужно проверять как минимум отсутвие для каждой записи, так что можно просто вставлять лбычными инсертами и игнорить ошибку дубликата.
Nick
Но инсерты сработают только если ид для одинаковых записей сохраняется, а не генерится обжектид на каждую вставку
Dmitriy
так, а разве на уровне бд по другому есть варианты, без апдейта существующих записе? в рсубд insertorreplace вроде так же работает. единственный вариант, который может быть в рсубд это запись через хранимку, которая будет селекты и инсерты если селект ничего не вернул
Dmitriy
тут мне кажется стоит спросить о величене справочника, который нужно обновлять?
Nick
Тут нужно просто положитьсч на уникальгый индекс по ид, он позволит не делать тот самый селект перед инсеррэтом
Dmitriy
Тут нужно просто положитьсч на уникальгый индекс по ид, он позволит не делать тот самый селект перед инсеррэтом
да, согласен, не уверен что по id, но уник тут решит проблему как вид. можно даже без селекта, а просто инсертить записи и игнорить ошибку дубликата в приложение
Amir
а кто-то знает, почему некоторые хранят в монге дату в виде unixtime, когда есть Date ?
Amir
в этом есть сакральный смысл с точки зрения бд? или просто лень?
Amir
точнее в формате Timestamps
Dmitriy
сакральный смысл может быть только в том, что int64 занимает меньше места в памяти чем object. и если не нужны выборки по датам, то такое решение может быть попыткой рационализации объемов данных
Amir
это овер оптимизация)
Amir
в таком случае можно брать константу старта проекта и считать ее за эпохальный старт в 0
Amir
тогда хватит int32 на всю жизнь
Dmitriy
в таком случае можно брать константу старта проекта и считать ее за эпохальный старт в 0
это даст сложности с конвертацией даты, нужен свой обработчик в приложение
Dmitriy
а таймстамп есть в любом ЯП
Egor
а еще это вполне зависит от объема операций
Amir
оператор сложения тоже есть в любом ЯП
Dmitriy
оператор сложения тоже есть в любом ЯП
это уже вызов лишней функции: const + ....
Amir
ну так себе дороговизна
Dmitriy
и потом уже timestamp в дату
Amir
а конвертить из стринги во время и еще пару if-оф не дороже будет?)
Egor
я вообще в осадок выпал от того что даже в вопросе http обмена народ жмёт документы всякими gzip и br
Egor
go быстрый, говорили они. но чето они все равно юзают fasthttp во все отверстия)
Amir
да тут в бд одни даты в стринге, другие в unixtime третие норм тип Timestamp
Egor
так что экономика должна быть экономной
Egor
да тут в бд одни даты в стринге, другие в unixtime третие норм тип Timestamp
это уже вопрос к архитектуре конкретных сервисомв. ничего не мешает юзать таймштамп везде
Amir
go быстрый, говорили они. но чето они все равно юзают fasthttp во все отверстия)
ну это наследие парней, которые уже 20 лет скорость ставят во глове стола)
Egor
ну это наследие парней, которые уже 20 лет скорость ставят во глове стола)
это результат необходимости в проектировании хайлоад сервисов и кучи параллельных вычислений, с бешеными eps
Egor
так что парни думают в нужном направлении
Egor
раскидывая нагрузку туда где она должна быть, облегчая то что лучше облегчить
Amir
так что парни думают в нужном направлении
согласен, но это corner edges - кому это правда нужно, остальные просто хвостом цепляются лишь бы микросекунды были)