Dmitriy
А всё-таки можно в запросе "померить" длину поля?
Попробуйте https://docs.mongodb.com/manual/reference/operator/aggregation/convert где упадёт на конвертации objectid в string тот ваш проблемный документ
Dmitriy
Но я ещё раз скажу, я бы на вашем месте не терял времени, особенно если речь идёт о проде. Снял бы дамп себе на локалку если хочется разобраться. И сделал бы update коллекции с установкой корректного значения в поле _id. У вас же ща прод лежит как я понял?
Иван
Спасибо, попробую!
Dmitriy
Спасибо, попробую!
На всякий случай ещё вариант - сделайте временно у структуры тип поля interface, сделайте штатную выборку и обойдите документы, где тайпкастинг поля ID упадёт при кастинге в objectid там проблема.) Это я так, мало ли пригодится)
Иван
Дело в том, что типом ObjectId в структуре наделено не только _id. Наверное при таком проходе ничего не упадёт, как я понимаю. Проблема именно в другом поле. Если я Вас правильно понял
Иван
Спасибо)
Dmitriy
А какое поле тайпкастингом проверять не имеет значения)
Anonymous
Ребята, без вашей помощи не разберусь mongoose Есть простая схема { date: { type: String, unique: true, }, values: [Object] } Мне нужно сделать запрос на добавление записи только если её не существует (если есть то обновить) и при этом нужно заменить массив values Делаю значит вот так: cosnt date = '30.03.2020' const update = { $push: { values: myArrayOfObjects, }, } await MyModel.findOneAndUpdate({ date }, update, { upsert: true }) но получаю ошибку на дубликат Нагуглил что нужно использовать $setOnInsert но как мне использовать его вместе с $push?
Daniil
{date:date} в условии
это эквивалетные записи в свежих версиях js
Aleksandr
Добрый день, подскажите пожалуйста, на уровне монги можно создать автоинкрементный счетчик при записи?
Aleksey
Подскажите. _id хранит в том числе и дату создания документа, возможно в таком случае сделать выборку по дате создания на основе _id ?
Dmitriy
Подскажите. _id хранит в том числе и дату создания документа, возможно в таком случае сделать выборку по дате создания на основе _id ?
теоретически возможно, но практически лучше заведите поле с датой создания в isodate. это будет и по перформансу лучше и по гибкости
Dmitriy
если такого поля нет, на имеющихся документах, то сделайте миграцию с добавлением поля, в качестве даты создания используйте дату из objectid для имеющихся документов https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/
Anonymous
Привет. Мне нужно как-то атомарно заменить всю коллекцию на новую. Самое близкое, что я придумал — rename с dropTarget, но тогда, насколько я понимаю, есть момент, когда коллекция пуста (между drop и реальным переименованием)
Anonymous
mongo 3.2
Anonymous
Кроме того, это сломает все текущие операции чтения из целевой коллекции
yopp
Привет. Мне нужно как-то атомарно заменить всю коллекцию на новую. Самое близкое, что я придумал — rename с dropTarget, но тогда, насколько я понимаю, есть момент, когда коллекция пуста (между drop и реальным переименованием)
1) добавить поле с «версией» коллекций и создать по нему индекс 2) поменять логику клиентов чтоб они использовали версию при выборках 3) вставить в коллекцию новые данные с новым значением поля с версией 4) переключить клиенты на использование новой версии
Anonymous
2. Очень дорого, хотелось бы без этого обойтись. Кроме того, я продолжаю читать документацию и кажется, что rename на самом деле получает лок на всю базу данных, и тогда это как будто бы действительно атомарно?
yopp
смотря что считать «атомарностью»
Anonymous
Никакая операция чтения не будет читать ни смешанные данные, ни пустую коллекцию (потому что не сможет выполниться, пока висит лок)
Anonymous
Меня устроит очень короткий даунтайм на переименование коллекции. Главное, чтобы никто не получил битых данных
yopp
тогда проще остановить клиентов и переименовать коллекции
Dmitriy
Меня устроит очень короткий даунтайм на переименование коллекции. Главное, чтобы никто не получил битых данных
ну так тогда подготовьте новую коллекцию, отключите клиентов и одной командой на ренейм переименуйте 2 коллекции
Anonymous
Остановка и запуск клиентов займут гораздо дольше, чем само переименование
yopp
это единтвенный способ гарантированно завершить все операции
yopp
штатно
Dmitriy
под отключением клиентов я имею в виду временное ограничение доступа к бд любым доступным вам способом
Anonymous
Проведу эксперимент с живым курсором и переименованием, посмотрю, что будет. Если renameCollection просто подвиснет, пока курсоры не закроют, это будет ок
yopp
если требуется штатное завершение запросов, то единственный способ — чтоб клиент сам отключился
yopp
всё остальное приведёт к отказу в обслуживании
Anonymous
Если нет, то действительно придётся делать схему с версиями
yopp
в таких ситуациях помогают «тормозилки» клиентов
yopp
но это дороже чем п.2
Anonymous
Привет В монге храняться даты в виде такой строки: 30.03.2020 и т.д. Могу ли я выбрать записи по диапазону дат? Например 25.03.2020 - 31.03.2020
Alex
не
Alex
переводи в дату
Anonymous
В какую именно? В любой тип лишь бы Date была?
Alex
https://docs.mongodb.com/manual/reference/method/Date/
Alex
да
Nick
Привет В монге храняться даты в виде такой строки: 30.03.2020 и т.д. Могу ли я выбрать записи по диапазону дат? Например 25.03.2020 - 31.03.2020
в пределах месяца - сможете по обычному сравнению строк, сквозь несколько месяцев - нет, и тут либо переводите в формат год-месяц-день либо сразу в нормальный тип даты как советуют выше
Anonymous
Знаю, что это уже не по теме, но у меня уже так припекает от этих дат... Есть массив дат в виде количества секунд (я так понимаю), вот таких например: 1585666112784 Я знаю, что в этом массиве время только в переделах 30 и 31 чисел Я конвертирую это в объект, где ключом выступает дата в формате dd.MM.yyyy, т. е. с каждым этим временем я делаю так: const date = format(new Date(time), 'dd.MM.yyyy') datesObj[date] = time Получаю объект с двумя ключами: 30.03.2020 и 31.03.2020. Пока все правильно. Дальше я хочу записать значение каждого ключа в монгу. Делаю так только в цикле, но вот для пример: const dates = Object.entries(datesObj) MyModel.findOneAndUpdate({ date: parse(dates[0][0], 'dd.MM.yyyy', new Date()) }, { value: dates[0][1] }, { upsert: true }) Открываю базу, там две записи, в первой значение date такое: 2020-03-29T21:00:00.000Z во второй такое: 2020-03-30T21:00:00.000Z Почему теряется блин один день
Nick
Знаю, что это уже не по теме, но у меня уже так припекает от этих дат... Есть массив дат в виде количества секунд (я так понимаю), вот таких например: 1585666112784 Я знаю, что в этом массиве время только в переделах 30 и 31 чисел Я конвертирую это в объект, где ключом выступает дата в формате dd.MM.yyyy, т. е. с каждым этим временем я делаю так: const date = format(new Date(time), 'dd.MM.yyyy') datesObj[date] = time Получаю объект с двумя ключами: 30.03.2020 и 31.03.2020. Пока все правильно. Дальше я хочу записать значение каждого ключа в монгу. Делаю так только в цикле, но вот для пример: const dates = Object.entries(datesObj) MyModel.findOneAndUpdate({ date: parse(dates[0][0], 'dd.MM.yyyy', new Date()) }, { value: dates[0][1] }, { upsert: true }) Открываю базу, там две записи, в первой значение date такое: 2020-03-29T21:00:00.000Z во второй такое: 2020-03-30T21:00:00.000Z Почему теряется блин один день
смотрите внимательно, у вас 21 час - первый признак кривой работы с таймзонами
Dmitriy
Знаю, что это уже не по теме, но у меня уже так припекает от этих дат... Есть массив дат в виде количества секунд (я так понимаю), вот таких например: 1585666112784 Я знаю, что в этом массиве время только в переделах 30 и 31 чисел Я конвертирую это в объект, где ключом выступает дата в формате dd.MM.yyyy, т. е. с каждым этим временем я делаю так: const date = format(new Date(time), 'dd.MM.yyyy') datesObj[date] = time Получаю объект с двумя ключами: 30.03.2020 и 31.03.2020. Пока все правильно. Дальше я хочу записать значение каждого ключа в монгу. Делаю так только в цикле, но вот для пример: const dates = Object.entries(datesObj) MyModel.findOneAndUpdate({ date: parse(dates[0][0], 'dd.MM.yyyy', new Date()) }, { value: dates[0][1] }, { upsert: true }) Открываю базу, там две записи, в первой значение date такое: 2020-03-29T21:00:00.000Z во второй такое: 2020-03-30T21:00:00.000Z Почему теряется блин один день
у вас ничего не теряется, в монге время хранится в UTC 0 просто)))) https://docs.mongodb.com/manual/reference/method/Date/
Anonymous
Почему оно не может брать мою таймзону (таймзону сервера) и все автоматически приводить к ней?
Nick
Почему оно не может брать мою таймзону (таймзону сервера) и все автоматически приводить к ней?
не обязанность монги, она не хранит информацию о тайм зоне - это обязанность разработчика позаботиться об этом
Anonymous
Как мне включить режим "блин, пожалуйста просто используй мою таймзону по умолчанию и переводи само время относительно этой таймзоны, я многого не прошу"?
Egor
Почему оно не может брать мою таймзону (таймзону сервера) и все автоматически приводить к ней?
потому что на клиенте может быть другая тайм зона, на сервере обычно хранят в gmt+0
Arsen
привет, подскажите пожалуйста как делать запрос в две коллекции?
Arsen
спасибо)
Danil
Всем привет, подскажите, можно ли получить данные из mongodb при помощи mongoose? Подскажите ссылку где почитать, еслитакое возможно
Araik
всем доброго времени суток, подскажите пжл, как мне обойти все документы поэтапно? Ну допустим по 100 шт в цикле ?
Araik
инкрементального индекса нет, мне нужно обойти все документы и в каждом, где timing > 10 добавить поле overReglament:true
Araik
а чуть точнее?
Yʉri 🇺🇦
а чуть точнее?
https://docs.mongodb.com/manual/reference/method/js-cursor/
Araik
куда копать — понял, спасибо!)
Araik
с документацией для PHP с монго не так просто как с js))
Araik
а еще какие-нибудь способы есть?))
Araik
в новой либе пхп для работы с монго нет getNext()
Araik
А почему нельзя просто сделать updateMany?
Да, я сейчас как раз к этому пришел
Araik
Araik
только получил ошибку Expected an update document with operator as first key or a pipeline in
Daniil
updateMany({ timing: { $gt: 10 } }, { $set: { overReglament: true } })
Araik
ну, я упростил несколько условие, там сложнее все немного
Daniil
Upsert не нужен судя по логике запроса
Daniil
Насчёт этого, не знаю пхп, но судя по всему во втором аргументе это должно быть обёрнуто в $set
Araik