AstraSerg
да но тогда почему обычный .count() занимает столько времени
написано, что DEPRECATED, попробуйте count_documents
Bro
он только недавно стал deprecated
Bro
да и какая разница говорю же из монго консоли то же самое
Bro
на js
Bro
надо на jira еще у них пошуршать
Nick
и всетаки я не могу понять в чем проблема. в том что время получения курсора и вермя выполнения метода count разное?
Bro
непонятно почему он сканирует всю коллекцию при вызове метода.
Nick
какого метода?
Vova
Курсор просто описывает запрос к бд, а выполнение всех действий курсора выполняется уже при соответствующем вызове
Bro
нашел https://jira.mongodb.org/browse/SERVER-3268?jql=text%20~%20%22cursor%20count%22
Bro
> c.count(true) 1000
Bro
вооо
Bro
так быстро работает
Bro
вообщем после .limit() если хочешь узнать сколько там элементов в курсоре нужно делать cursor.count(true)
Nick
только вот порос зчем вам каунт если вы его итак лимитировали 1000
Bro
а там может быть меньше / больше
Nick
больше не может, лимит же
Bro
cursor.count(with_limit_and_skip=True) в pymongo
Bro
1000 от балды значение вариативно
Nick
я не про это, суть count() посчитать количество доков подходящих под условие, которые лежат в бд
Nick
какой смысл запрашивать количество доков которые вы итак вытаскиваете из бд посредством курсора, которому наплевать на количество
Nick
может опишите задачу которую вы решаете и я тогда пойму почему так а не иначе
Bro
https://docs.mongodb.com/manual/reference/method/cursor.count/
Bro
Counts the number of documents referenced by a cursor. Append the count() method to a find() query to return the number of matching documents.
Bro
решена задача уже
Nick
допустим решена, а как вы дальше используете полученное количество из count?
Bro
процессинг элементов из коллекции. берется N документов, обрабатывается. Процесс стартует заново. Кол-во элементов в курсоре нужно для логов / чтобы не передавать лишнее (избыточное) значение между калбэками итд метод есть, почему бы не использовать.
Nick
а что мешает просто сделать счетчик на стороне приложения?
Bro
проблема была только в том после limit/skip нужно не забывать with_limit_and_skip ставить в .count()
Nick
это целый минус один запрос в базу на каждый такой запрос
Nick
а каждый запрос в бд на порядки дороже счетчика
Bro
уже сделал
V
Ребят а есть ли какой то способ тестировать бекапы ? вот скрипт сделал бекап и загружает его на удаленное хранилище , есть ли способ убедиться перед загрузкой на сервер что был сделал рабочий бекап
Dave
большой бекап
Ну мы так и делаем на бекап сервере
Dave
Каждый раз скриптом разворачиваем на staging
V
Очень важно определится что такое «рабочий бэкап»
рабочий бекап (это копия базы на момент сотворения бекапа)
yopp
Это очень плохое определение
yopp
Нужны конкретные признаки «рабочести»
yopp
Измеримые
V
Это очень плохое определение
а есть какая то теория бекапов ?
V
определяющая все эти понятия
Dave
Ибо если будет битый->тесты завалятся
yopp
yopp
Проверка целостности данных — адски сложная штука
yopp
Нужно найти какие-то признаки, которые можно сверять.количество документов например. Или если вы храните заказы, то ещё и сумму.
Oleg
хотябы физический уровень. знать что при восстановлении бекапа база будет доступна, коллекции можно будет вылить
yopp
А пустые бэкапы это очень частая проблема
Oleg
можно проверять кодвозврата mongodump-а, размер бекапа /bin/mongodump --username "$DUMPUSER" --password "$DUMPPASS" --authenticationDatabase admin --out ${CURBACKUPDIR} --gzip 2> dump.log STATUS=$? ... SIZE=$(du -sb ${CURBACKUPDIR} | awk '{print $1}') zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -z ${ZABBIX_HOST} -p 10051 -k mongo.backup.status -s "$HOSTNAME" -o "$STATUS" zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -z ${ZABBIX_HOST} -p 10051 -k mongo.backup.size -s "$HOSTNAME" -o "$SIZE" zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -z ${ZABBIX_HOST} -p 10051 -k mongo.backup.path -s "$HOSTNAME" -o "${CURBACKUPDIR}" в мониторинге пиликать на нулевой статус, неприлично мелкий размер бекапа
Nick
может тогда проще в момент бекапа сохранить текущий размер данных и после рестора его чекать
yopp
Это косвенный показатель целостности
yopp
Бэкап может быть большим, но битым
Nick
опять же как и говорит @dd_bb нужно для себя явно обозначить критерий "целостности" иначе любые действия будут бесполезны
yopp
Тут вопрос, вы хотите бэкапы для галочки или для данных
AstraSerg
хотябы физический уровень. знать что при восстановлении бекапа база будет доступна, коллекции можно будет вылить
Это уже можно назвать достаточно формальным признаком. Если этого достаточно, тогда импортировать и проверить код возврата процесса. Самоя простая и быстрая проверка — посмотреть размер файла бакапа или количество строк (wc -l). но она и самая не надежная. Самая надежная - произвести вычисления на боевой и восстановленной из бакапа базе (типа суммы, как предлагал yopp) но это и долго. Вот вам 2 крайности, выбирайте вариант внутри.
yopp
Размер это не проверка
yopp
Даже контрольная сумма не проверка
yopp
Потому что по миллиону причин пока у вас может быть битый файл
yopp
И процесс завершится успешно
V
@yopp а можешь пример рассказать на какой то тестовой базе , так как пока что звучит сложно . не получается грамотно сказать что же является целым бекапом( для начала хочется чтобы он был не пустой хотябы)
Vova
{ _id: "...", Data: { "key1": "value1", "key2": "value2" } } Нужно поменять значение value2 на value3 update({ "Data.key2": "value2" }, { $set: { "Data.key2": "value3" } }) Правильно?
Vova
updateOne undateMany or update multi true
Та не суть, мне главное json
Артём
Как можно найти все документы, где status = "progress" или "finished"? .findOne({ status: "progress" })
Vova
{status: { $in: ["progress", "finished"] }}
Артём
Спасибо
A
Приветы. А насколько плохая идея использовать aggregation framework для обычных регулярных запросов? Понятно, что нереляционность, документо-ориентированность и вот это всё. Но тем не менее случилось страшное - надо джойнить данные две колекции и фильтровать одну на основе полей других. Фактически есть еще путь с хранением избыточных данных. Но интересно попробовать aggregation.
️lefrotite
{boys:{ Max:{...}, John:{...}} Как найти документы, у которых в объекте boys есть объект Max? через $in?
Nick
$exists
️lefrotite
Благодарю
A
Не бывает хороших или плохих идей. Возьмите срез ваших данных и моделируйте запросы
А я вот нигде не найду никаких данных о его произодительности. Знаю, что встроенный map-reduce раньше был однопоточный. А aggregation? Единственный ли ограничивающий фактор у него производительность пайплайна который я передаю или есть еще что-то?