Dmitriy
Но я ещё раз скажу, я бы на вашем месте не терял времени, особенно если речь идёт о проде. Снял бы дамп себе на локалку если хочется разобраться. И сделал бы update коллекции с установкой корректного значения в поле _id. У вас же ща прод лежит как я понял?
Иван
Спасибо, попробую!
Dmitriy
Спасибо, попробую!
На всякий случай ещё вариант - сделайте временно у структуры тип поля interface, сделайте штатную выборку и обойдите документы, где тайпкастинг поля ID упадёт при кастинге в objectid там проблема.)
Это я так, мало ли пригодится)
Иван
Дело в том, что типом ObjectId в структуре наделено не только _id. Наверное при таком проходе ничего не упадёт, как я понимаю. Проблема именно в другом поле. Если я Вас правильно понял
Dmitriy
Иван
Спасибо)
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?
Nick
Daniil
Ребята, без вашей помощи не разберусь
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?
https://stackoverflow.com/questions/21805026/mongodb-setoninsert-and-push-if-already-existent
судя по этому коду, вы не используете результат операции, можно использовать метод updateOne вместо findOneAndUpdate
Aleksandr
Добрый день, подскажите пожалуйста, на уровне монги можно создать автоинкрементный счетчик при записи?
Dmitriy
Aleksandr
Aleksey
Подскажите. _id хранит в том числе и дату создания документа, возможно в таком случае сделать выборку по дате создания на основе _id ?
Dmitriy
Dmitriy
если такого поля нет, на имеющихся документах, то сделайте миграцию с добавлением поля, в качестве даты создания используйте дату из objectid для имеющихся документов https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/
Aleksey
Anonymous
Привет.
Мне нужно как-то атомарно заменить всю коллекцию на новую. Самое близкое, что я придумал — rename с dropTarget, но тогда, насколько я понимаю, есть момент, когда коллекция пуста (между drop и реальным переименованием)
Anonymous
mongo 3.2
Anonymous
Кроме того, это сломает все текущие операции чтения из целевой коллекции
Anonymous
2. Очень дорого, хотелось бы без этого обойтись.
Кроме того, я продолжаю читать документацию и кажется, что rename на самом деле получает лок на всю базу данных, и тогда это как будто бы действительно атомарно?
yopp
смотря что считать «атомарностью»
Anonymous
Никакая операция чтения не будет читать ни смешанные данные, ни пустую коллекцию (потому что не сможет выполниться, пока висит лок)
Dmitriy
yopp
Anonymous
Меня устроит очень короткий даунтайм на переименование коллекции. Главное, чтобы никто не получил битых данных
yopp
тогда проще остановить клиентов и переименовать коллекции
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
да
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
Почему оно не может брать мою таймзону (таймзону сервера) и все автоматически приводить к ней?
Anonymous
Anonymous
Как мне включить режим "блин, пожалуйста просто используй мою таймзону по умолчанию и переводи само время относительно этой таймзоны, я многого не прошу"?
Egor
Arsen
привет, подскажите пожалуйста как делать запрос в две коллекции?
Arsen
спасибо)
Danil
Всем привет, подскажите, можно ли получить данные из mongodb при помощи mongoose? Подскажите ссылку где почитать, еслитакое возможно
Yehor
Araik
всем доброго времени суток, подскажите пжл, как мне обойти все документы поэтапно? Ну допустим по 100 шт в цикле ?
Araik
инкрементального индекса нет, мне нужно обойти все документы и в каждом, где timing > 10 добавить поле overReglament:true
Yʉri 🇺🇦
Araik
а чуть точнее?
Yʉri 🇺🇦
а чуть точнее?
https://docs.mongodb.com/manual/reference/method/js-cursor/
Araik
куда копать — понял, спасибо!)
Araik
с документацией для PHP с монго не так просто как с js))
Araik
а еще какие-нибудь способы есть?))
Araik
в новой либе пхп для работы с монго нет getNext()
Daniil
Araik
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
Araik