Anonymous
а как копировать в нативном драйвере Ноды? чето не найду в апи
Oleg
хз. имхо удобнее командами https://docs.mongodb.com/manual/tutorial/backup-and-restore-tools/
Dmitry
Комнадами проще так db.copyDatabase('old_name', 'new_name') use old_name db.dropDatabase()
Anonymous
ну мне из приложения надо
Dmitriy
ребят, подскажите, как в монге сделать в $group деление одной суммы на другую? Т.е. как мне в АФ реализовать такое: select sum(a)/count(b) from t group by c ?
Даниил (Onix)
Парни, всем привет. Есть там такая модель (схема): - user - student - instructor Когда создаём юзера, автоматически создаётся копия студента или инструктора. Студенты и инструктора обладают расширенным набором полей. Зачем нужно такое дублирование? Почему бы не хранить юзеров с "типом юзера" внутри? Или вместо юзеров хранить отдельно студентов и инструкторов... p.s. кейс учебный
Anonymous
Если юзер может быть одновременно и студентом и инструктором, или одновременно быть несколькими инструкторами в разных курсах/что у тебя там, то тогда думаю понятно, для чего сделано именно так.
Anonymous
Если же нет, и нет возможности миграции из студента в инструктора и наоборот, то тогда скорее всего, чтобы искать информацию о пользователе в одной коллекции, а информацию о студенте - в другой.
Dmitriy
Два поля с $sum и потом ещё одно поле с $div
Как-то так? $group: { a: {$sum: "$a"}, b: {$sum: 1}, c: {$div: [$a, $b]} }
Ilya
Столкнулся с очень странной проблемой: у меня транзакция не выполняется до конца, вернее, выполняется частично. Вылезает следующая ошибка: UnhandledPromiseRejectionWarning: MongoError: Transaction 1 has been committed. С чего вдруг происходят такие вещи, мне непонятно. Однако примечательно, что у меня действительно транзакция не осуществляется полностью, атомарность не соблюдается. Сначала идет нового документа при помощи функции updateOne и оператора $setOnInsert. Затем возникает эта ошибка, причем появляется она на изменении того же самого, только что созданного документа (устанавливаю значение поля при помощи оператора $set. причем поля, которое не задействовано в $setOnInsert). И вот тут то она и вылезает. В общем, я запускаю транзацию, документ вставляется, потом появляется данная ошибка и транзакция прерывается, но не откатывается. То есть я захожу в базу, вижу док(первая операция в транзации), но то самое поле, которое я изменяю второй операцией, оно не назначено. P.S. Сессию передаю при помощи .session(session), раньше, на других транзакциях, все работало прекрасно. Чтение - снепшот, запись - маджорити
yopp
Столкнулся с очень странной проблемой: у меня транзакция не выполняется до конца, вернее, выполняется частично. Вылезает следующая ошибка: UnhandledPromiseRejectionWarning: MongoError: Transaction 1 has been committed. С чего вдруг происходят такие вещи, мне непонятно. Однако примечательно, что у меня действительно транзакция не осуществляется полностью, атомарность не соблюдается. Сначала идет нового документа при помощи функции updateOne и оператора $setOnInsert. Затем возникает эта ошибка, причем появляется она на изменении того же самого, только что созданного документа (устанавливаю значение поля при помощи оператора $set. причем поля, которое не задействовано в $setOnInsert). И вот тут то она и вылезает. В общем, я запускаю транзацию, документ вставляется, потом появляется данная ошибка и транзакция прерывается, но не откатывается. То есть я захожу в базу, вижу док(первая операция в транзации), но то самое поле, которое я изменяю второй операцией, оно не назначено. P.S. Сессию передаю при помощи .session(session), раньше, на других транзакциях, все работало прекрасно. Чтение - снепшот, запись - маджорити
Убедитесь что это в одной транзакции происходит
Dmitriy
Ага
Спасибо, попробую!
Ilya
к тому же если бы это были разные транзакции, скорее всего вылезал бы write conflict (наверное)
Nick
Как-то так? $group: { a: {$sum: "$a"}, b: {$sum: 1}, c: {$div: [$a, $b]} }
добавьте прожект просле группировки и там уже вычисляйте
Nick
а так будет шлак
yopp
а так будет шлак
Почему шлак?
Nick
хороший вопрос, походу надо тестануть
Ilya
Убедитесь что это в одной транзакции происходит
Я ведь вот чему удивляюсь, по идее, такого вообще в принципе быть не может быть, транзакция либо проходит вся, либо не проходит совсем. И сессию вроде передаю, и await-ы везде проставлены...
yopp
Посмотрите в исходника
Dmitriy
а может просто $avg?
avg даст же среднее по одному значению, а мне надо сначала вычислить сумму и количество за день, а потом поделить сумму на количество
Nick
смутил count
Nick
Почему шлак?
чекнул $div нельзя использовать в группировке напрямую
Ilya
Посмотрите в исходника
Я вроде бы знаю, что в апишке есть функция, которая позволяет проверить, запущена ли щас транзакция или нет, а как можно проверить текущие сессии? Есть вероятность, что у меня каким то образом множится session. Просто я стартую с let newSession = await mongoose.startSession(), а затем передаю newSession из функцию в функцию, проводя уже непосредственно операции в транзакции.
Nick
Ну тогда $addFelds после $group
точно, все забываю про него что можно не писать проекцию
Dmitriy
@dd_bb @yatoba спасибо еще раз, все работает
Ilya
Я ставлю на то, что там по какой-то причине несколько транзакций
Проверил, и оказалось, что у меня откуда-то наплодилось ServerSession. Не совсем уверен, что до конца понимаю, что это такое
Semyon V
указав все возможные индексы в mongoose я расслабился и состредоточился на самом приложении. а сегодня в метрике я обратил внимание на следующее:
Semyon V
вопрос. с какой стороны подступиться к проблеме для выяснения слабых мест?
Anonymous
MongoDB 4.2 db.copyDatadase() depricated. Какой альтернативный механизм предлагается?
Anonymous
Старую коллекцию влить в новую на новом сервере
Nick
дамп/рестор
Anonymous
А рестор может слить 2 коллекции? Если идёт запись в реальном времени
Anonymous
Нужно дописывать записи из старой коллекции
Nick
без даунтайма никак?
Anonymous
Нет, в старой террабайт
Anonymous
Думаю руками скрип написать...
Nick
а в чем необходимость переезда?
Anonymous
Другой сервер с большими дисками.
Nick
даунтайм допустим?
Anonymous
нет
Nick
сервер один или часть репликасета?
Anonymous
Один
yopp
Один
Не сможете без даунтайма.
yopp
Вы можете попробовать на 4.2 https://docs.mongodb.com/manual/reference/operator/aggregation/merge/
yopp
Если коллекции в одной базе
Nick
тут как я понял как раз перезд на новые серваки в новую бд
Anonymous
Даунтайм на запись нельзя, на чтение можно. Переклучу на новый сервер писателей и буду руками сливать старое
Anonymous
Разные сервера в разных сетях
yopp
Даунтайм на запись нельзя, на чтение можно. Переклучу на новый сервер писателей и буду руками сливать старое
Если у вас один сервер, то очень странно видеть про «даунтайм нельзя»
Anonymous
В новом будет 2
yopp
В новом будет 2
Какое у вас ограничение по даунтайму в год?
Anonymous
Нет в год задачи. В монго идёт итоговая статистика - читается не так чтоб критично. Критично, что писатели начнут накапливать данные на запись, может цепная реакция быть при пике нагрузки. Соответственно минут 10 есть.
yopp
У вас все в одном ДЦ находится?
Anonymous
Нет, по этому и не успею.
Anonymous
Вообще со своим скриптом меня устраивает вполне. Просто искал стандартное решение для моего. Спасибо за советы
yopp
Я это к тому что 2 сервера может быть недостаточно для обеспечения указанных требований. Вам стоит прописать все требования и проверить что ваш деплой этим требованиям удовлетворяет
yopp
Ещё один из вариантов это перезапустить сервер как реплику
yopp
Дальше вы сможете штатными средствами добавить оставшиеся сервера и реплицировать весь объём данных штатными средствами.
Anonymous
Это конечно, сейчас смотрим. До этого было исследование подойдет ли монга.
Anonymous
Думал из в кластер, но нужно срочно. На старой ресурсы заканчивается. Придется ручками
Dmitrii
Привет всем, требуется совет. С недавнего времени стало появялся много ошибок в логе вида БД, replicaset, работает в контейнере (openshift) приложение никаких проверок монги не делает, все что есть из настроенного это проверка ноды echo 'quit(db.runCommand({ ping })' | mongo $host:27017/test --quiet || rc=1 но эта команда не может генерировать такую ошибку, я прав или нет? Ошибка больше похожа на запуск rs.status() 2019-08-30T08:05:12.801+0000 I ACCESS [conn15345] Unauthorized: not authorized on admin to execute command { replSetGetStatus: 1.0, forShell: 1.0, $clusterTime: { clusterTime: Timestamp(1567152307, 1), signature: { hash: BinData(0, 9CFCFE34111B56B35E4CE8E6E5E435EA4E433C03), keyId: 6681208772985094146 } }, $db: "admin" } 2019-08-30T08:05:12.805+0000 I NETWORK [conn15345] end connection 192.168.80.225:60408 (9 connections now open)
yopp
http://www.vldb.org/pvldb/vol12/p2254-kamsky.pdf
yopp
4.2.0 (Aug 13) ◦ 4.0.12 (Aug 12) • Плейграунд для запросов • Документация • Официальные курсы по MongoDB Stable: 4.2.0 ◦ Bugfix: 4.0.12 Legacy: 3.6.14 (Aug 26) ◦ EOL: 3.4.22 (Aug 6, 💀 Jan ‘20) ☠️: 3.2.21 (Dec ’18), 3.0.15 (May ’17)
yopp
3.6.14 - Aug 26, 2019: https://docs.mongodb.com/manual/release-notes/3.6/#aug-26-2019
Anonymous
есть ли способ узнать существует ли бд из нативного драйвера?
Nikita
Всем привет. Ранее не работал с MongoDB. Погуглил, как я понял, самая популярная ODM это Mongoose, и соответственно Node.js самая популярная платформа для MongoDB. Подскажите, как решается вопрос миграций?
yopp
Mongoose очень кривой. Один из лучших ODM в руби — Mongoid
yopp
Но и там вопрос с миграциями не решается