yopp
А какая версия монги?
Anonymous
4.2.3
yopp
4.2.3
Тогда что-то в таком духе https://t.me/MongoDBRussian/62029
yopp
Нет, нельзя. Но это очень быстро
Anonymous
Нет, нельзя. Но это очень быстро
а насколько быстро ?
просто выглядит со стороны перформанса не очень:
берем массив, итерируемся, чето мержим а потом еще в конце перезаписываем все это поле
и чтоо с индексами будет ?
Anonymous
Philipp
Ребят, а в Compass Community можно как-нибудь переименовать коллекцию?
RusaXXX
Подскажите коннект в монго на ноде нужно создавать один раз при старте системы? Чет везде примеры создают коннект, и внутри делают работу с бд
Или коннект нужно делать всякий раз когда получаем запросы от юзера например?
Anton.
Всем привет! Нужна помощь. Пытаюсь занести данные в бд таким образом
const myUser = await user
user.pages[page][key] = {done: true};
user.save()
и это срабатывает единожды, только если нет такого поля [page], а в последующие разы ничего в бд не добавляется, в чем может быть проблема?
yopp
RusaXXX
yopp
Драйвер сам закроет соединения когда процесс будет завершён
yopp
yopp
¯\_(ツ)_/¯
yopp
Не вижу смысла закрывать соединения в этих случаях
yopp
Закрывать соединение стоит только в том случае, если монга больше не нужна, а приложение продолжит долго работать и не будет больше делать запросов
yopp
Установка соденинеия, особенно через tls это дорогая операция
Anonymous
yopp
yopp
В остальном:
In MongoDB, a write operation is atomic on the level of a single document, even if the operation modifies multiple embedded documents within a single document.
Anonymous
RusaXXX
А можно как то из кода узнать хост и порт монги,
MongoDB shell version v4.0.6
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
2020-04-09T16:25:09.839+0000 E QUERY [js] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:343:13
не могу внутри докера залезть в монгу. Но из кода работает
Евгений
Добрый день. Есть в монге возможность установить действие по умолчанию при конфликте уникального поля? Типа ON CONFLICT в pgsql
Nick
Nick
Но можно делать апдейт с флагом апсерт
Nick
Евгений
Нет
т.е., если я insertMany делаю и у меня один документ не будет проходить - вся пачка не запишется?
Евгений
Нет
т.е., мне надо deleteMany сначала, а потом insertMany ?
не очень оптимально выглядит (
yopp
Евгений
yopp
Если это 3.6 и выше и вы внутри сессии вставляете бати, то если я не ошибаюсь, вам по каждой ошибке вернётся по документу. Но я не уверен что весь батч выполнится
Евгений
Евгений
yopp
yopp
А, там надо unordered: true с 3.2
yopp
With an unordered list of operations, MongoDB can execute the operations in parallel, but this behavior is not guaranteed. If an error occurs during the processing of one of the write operations, MongoDB will continue to process remaining write operations in the list.
yopp
https://docs.mongodb.com/manual/core/bulk-write-operations/#ordered-vs-unordered-operations
Евгений
yopp
А откуда конфликты?
Евгений
А откуда конфликты?
это цикличная запись документов спарсеных
они могут повторяться, а могут нет
чаще повторяются
поэтому проверять на уникальность самому - большие потери
лучше бы игнорировать конфликт уникальности без действий и исключений
yopp
Самый простой вариант добавить ещё один признак уникальности, например дату или номер выгрузки, и использовать его в выборках. Тогда вы сможете вставлять без конфликтов, атомарно переключать версии выгрузок и руками контролировать сборку мусора
yopp
Это самый дешевый вариант с точки зрения сложности вставки
Евгений
yopp
Я так понимаю что у вас задача синхронизации внешнего источника с коллекцией в монге, при сохранении целостности представления для клиентов.
Фундаментально есть два варианта: merge и replace
Merge самый вычислительно сложный и требует много чтения, но не требует много записи и бесплатен с точки зрения потребления результата. Так или иначе это две тяжелые операции: вычисление дельты, обновление состояния и какой-то механизм разрешения конфликтов. Есть разные подходы к реализации, в том числе ваш, через уникальное поле и нарушение констрейна по уникальности.
Replace самый дешёвый по вычислениям, но будет требовать или много записи или чуть меньеше записи, но немного стоить при потреблении результата синхронизации.
Его можно реализовать или через очистку коллекции, или через вставку в новую коллекцию или через вставку в существующую коллекцию.
Я не вижу смысла сразу удалять документы, по этому остаётся два варианта:
1) вставлять все данные из источника в новую коллекцию. Выделить коллекцию с фиксированным именем для хранения названия коллекции с данными последней выгрузки и использовать имя этой коллекции на стороне клиента для выборки. Минус такого подхода что имя коллекции будет не фиксированое, придётся постоянно следить за индексам. Плюс: он ничего кроме обновления имени коллекции не требует.
2) вставлять данные из источника в существующую коллекцию, с предыдущим результатам выгрузок. Для того чтоб избежать конфликтах при вставке, в документ добавляется новое поле с «версией выгрузки». Это поле добавляется как префикс ко всем индексам в коллекции. По завершению выгрузки, значение новой версии записывается в отдельную коллекцию. Клиенты при чтении из коллекции должны указывать какую версию они используют. Минусы: отдельное поле, без использования которого в запросе можно получить документы из других версий; дополнительное поле в индексе.
Евгений
Я так понимаю что у вас задача синхронизации внешнего источника с коллекцией в монге, при сохранении целостности представления для клиентов.
Фундаментально есть два варианта: merge и replace
Merge самый вычислительно сложный и требует много чтения, но не требует много записи и бесплатен с точки зрения потребления результата. Так или иначе это две тяжелые операции: вычисление дельты, обновление состояния и какой-то механизм разрешения конфликтов. Есть разные подходы к реализации, в том числе ваш, через уникальное поле и нарушение констрейна по уникальности.
Replace самый дешёвый по вычислениям, но будет требовать или много записи или чуть меньеше записи, но немного стоить при потреблении результата синхронизации.
Его можно реализовать или через очистку коллекции, или через вставку в новую коллекцию или через вставку в существующую коллекцию.
Я не вижу смысла сразу удалять документы, по этому остаётся два варианта:
1) вставлять все данные из источника в новую коллекцию. Выделить коллекцию с фиксированным именем для хранения названия коллекции с данными последней выгрузки и использовать имя этой коллекции на стороне клиента для выборки. Минус такого подхода что имя коллекции будет не фиксированое, придётся постоянно следить за индексам. Плюс: он ничего кроме обновления имени коллекции не требует.
2) вставлять данные из источника в существующую коллекцию, с предыдущим результатам выгрузок. Для того чтоб избежать конфликтах при вставке, в документ добавляется новое поле с «версией выгрузки». Это поле добавляется как префикс ко всем индексам в коллекции. По завершению выгрузки, значение новой версии записывается в отдельную коллекцию. Клиенты при чтении из коллекции должны указывать какую версию они используют. Минусы: отдельное поле, без использования которого в запросе можно получить документы из других версий; дополнительное поле в индексе.
я понял
я бы предложил в таком духе другой вариант
записывать можно в ту же коллекцию, не глядя на уникальность
сделать версионирование по времени записи
читать можно не запоминая ничего, просто версию с максимальным временем
и отдельным процессом запустить очистку от старых версий
или вообще, сначала писать, тут же в этом же скрипте удалять старую версию, а клиенты всегда самую новую читать будут и все
база исчисляется терабайтами, увеличение размера за счет версий разных - как бы вообще плохой вариант - дорого по носителям очень
посчитать бы, насколько размер вырастет коллекции с уборкой старых версий как-то )
но в принципе, мне не настолько критична полнота базы в момент между удалением и записью, а логика самая простая при этом и места не надо дополнительно
yopp
Выбор максимальной версии дорогая операция
yopp
Из существующей коллекции в смысле
yopp
Размер коллекции в худшем случае вырастет в два раза
yopp
Тут вопрос какой capacity у вас больше: read на вычисление дельт или write на версионирование
Евгений
Евгений
Выбор максимальной версии дорогая операция
из двух дорого выбирать?
да и выбирать придется только для очень ограниченного количества записей в каждый отдельный момент времени, особенно по сравнению с общим количеством записей
Евгений
yopp
GSA
Приветствую всех!
Опыта в монге у меня почти нет. И появился вопрос, ответа на который не могу найти.
Есть коллекция. В ней несколько полей, одно из которых дата. Из коллекции получаю запись. Обрабатываю. Меняю дату на текущую+некоторый случайный временной интервал. Записываю обратно в коллекцию.
Вопрос следующий. Как сделать так, чтобы записи хранились в базе отсортированными по дате? Т.е. записываю я запись с изменённой датой в коллекцию и она (запись) сразу размещается в соответствии с сортировкой.
GSA
Или по другому: мне нужно чтобы записи сортировались не по запросу, а чтобы хранились сортированными по дате.
В компасе данные выведены с какой то сортировкой. Так вот как сделать чтобы они там были сортированы по дате?
Ilya
Ну и запрашивай с сортировкой по вашему полю в чем проблема то
Евгений
Dmitriy
а какой смысл от этой задачи, какую практическую цель вы пытаетесь достичь? избавится в коде от сортировки, но зачем?
Евгений
Dmitriy
Есть индекс по умолчанию по _id
немного добавлю: и это сделано не просто так, а из соображений того что монга гарантирует наличие этого поля. какие еще будут поля в документах (а в одной коллекции могут быть документы с разными наборами полей) монга не знает. и соответственно строить по ней сортировку не может
Евгений
Евгений
Евгений