yopp
А какая версия монги?
Anonymous
4.2.3
yopp
4.2.3
Тогда что-то в таком духе https://t.me/MongoDBRussian/62029
Anonymous
Тогда что-то в таком духе https://t.me/MongoDBRussian/62029
спасибо, сейчас гляну, но выглядит очень похожим на правду, спасибо большое!)
Anonymous
Тогда что-то в таком духе https://t.me/MongoDBRussian/62029
супер, работает только вот вопрос - можно ли как-то обойтись без итерации ?)
yopp
Нет, нельзя. Но это очень быстро
Anonymous
Нет, нельзя. Но это очень быстро
а насколько быстро ? просто выглядит со стороны перформанса не очень: берем массив, итерируемся, чето мержим а потом еще в конце перезаписываем все это поле и чтоо с индексами будет ?
yopp
а насколько быстро ? просто выглядит со стороны перформанса не очень: берем массив, итерируемся, чето мержим а потом еще в конце перезаписываем все это поле и чтоо с индексами будет ?
Сомневаюсь что вы эту итерацию вообще заметите на фоне всего остального :) Даже если там будет несколько тысяч элементов Индексы работают как работали. Update Pipeline выполняется только для каждого попавшего в условие документа. Т.е это исключительно стадия трансформации
Philipp
Ребят, а в Compass Community можно как-нибудь переименовать коллекцию?
RusaXXX
Подскажите коннект в монго на ноде нужно создавать один раз при старте системы? Чет везде примеры создают коннект, и внутри делают работу с бд Или коннект нужно делать всякий раз когда получаем запросы от юзера например?
Anton.
Всем привет! Нужна помощь. Пытаюсь занести данные в бд таким образом const myUser = await user user.pages[page][key] = {done: true}; user.save() и это срабатывает единожды, только если нет такого поля [page], а в последующие разы ничего в бд не добавляется, в чем может быть проблема?
RusaXXX
Один раз при запуске инстанса приложения
А еще вопрос , в какой момент нужно закрывать соединение client.close();?
yopp
Драйвер сам закроет соединения когда процесс будет завершён
RusaXXX
Драйвер сам закроет соединения когда процесс будет завершён
Везде примеры с закрытием соединения, не пойму для чего тогда. Есть моменты когда нужно принудительно закрывать ?
RusaXXX
А где вы смотрите на примеры?
https://mongodb.github.io/node-mongodb-native/3.0/reference/ecmascriptnext/connecting/
RusaXXX
А где вы смотрите на примеры?
https://metanit.com/web/nodejs/6.2.php
yopp
¯\_(ツ)_/¯
yopp
Не вижу смысла закрывать соединения в этих случаях
yopp
Закрывать соединение стоит только в том случае, если монга больше не нужна, а приложение продолжит долго работать и не будет больше делать запросов
yopp
Установка соденинеия, особенно через tls это дорогая операция
yopp
а еще вопрос про конкуретные обновления, не будет ли с ними проблем ?
Хороший вопрос. Не уверен что не будет. Можно для надежности использовать optimistic lock и делать retry
Anonymous
Хороший вопрос. Не уверен что не будет. Можно для надежности использовать optimistic lock и делать retry
Я почитал про WiredTiger как дефолтный движок монго, у него под капотом mvcc, он по дефолту использует оптимистик лок на уровне целого документа и ретрай при конфликтах Так что проблем вроде как быть не должно)
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.
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
Но можно делать апдейт с флагом апсерт
Евгений
Нет
т.е., если я insertMany делаю и у меня один документ не будет проходить - вся пачка не запишется?
Евгений
Нет
т.е., мне надо deleteMany сначала, а потом insertMany ? не очень оптимально выглядит (
yopp
Если это 3.6 и выше и вы внутри сессии вставляете бати, то если я не ошибаюсь, вам по каждой ошибке вернётся по документу. Но я не уверен что весь батч выполнится
Nick
т.е., мне надо deleteMany сначала, а потом insertMany ? не очень оптимально выглядит (
А зачем батчи? Нельзя по одному доку это делать игнорировать дубликаты? Или еужно перезаписывать на новое?
Nick
т.е., мне надо deleteMany сначала, а потом insertMany ? не очень оптимально выглядит (
Есть еще такое https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/
Евгений
А зачем батчи? Нельзя по одному доку это делать игнорировать дубликаты? Или еужно перезаписывать на новое?
очень много документов и пишется через сеть по одному получается много потерь на связь
yopp
Общий эксепшн 11000 выскакивает
Точно внутри сессии вставляете?
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
Евгений
А какой у вас кейс?
у меня запись пачек по несколько тысяч документов в 100 потоков
yopp
А откуда конфликты?
Евгений
А откуда конфликты?
это цикличная запись документов спарсеных они могут повторяться, а могут нет чаще повторяются поэтому проверять на уникальность самому - большие потери лучше бы игнорировать конфликт уникальности без действий и исключений
yopp
Самый простой вариант добавить ещё один признак уникальности, например дату или номер выгрузки, и использовать его в выборках. Тогда вы сможете вставлять без конфликтов, атомарно переключать версии выгрузок и руками контролировать сборку мусора
yopp
Это самый дешевый вариант с точки зрения сложности вставки
yopp
Я так понимаю что у вас задача синхронизации внешнего источника с коллекцией в монге, при сохранении целостности представления для клиентов. Фундаментально есть два варианта: merge и replace Merge самый вычислительно сложный и требует много чтения, но не требует много записи и бесплатен с точки зрения потребления результата. Так или иначе это две тяжелые операции: вычисление дельты, обновление состояния и какой-то механизм разрешения конфликтов. Есть разные подходы к реализации, в том числе ваш, через уникальное поле и нарушение констрейна по уникальности. Replace самый дешёвый по вычислениям, но будет требовать или много записи или чуть меньеше записи, но немного стоить при потреблении результата синхронизации. Его можно реализовать или через очистку коллекции, или через вставку в новую коллекцию или через вставку в существующую коллекцию. Я не вижу смысла сразу удалять документы, по этому остаётся два варианта: 1) вставлять все данные из источника в новую коллекцию. Выделить коллекцию с фиксированным именем для хранения названия коллекции с данными последней выгрузки и использовать имя этой коллекции на стороне клиента для выборки. Минус такого подхода что имя коллекции будет не фиксированое, придётся постоянно следить за индексам. Плюс: он ничего кроме обновления имени коллекции не требует. 2) вставлять данные из источника в существующую коллекцию, с предыдущим результатам выгрузок. Для того чтоб избежать конфликтах при вставке, в документ добавляется новое поле с «версией выгрузки». Это поле добавляется как префикс ко всем индексам в коллекции. По завершению выгрузки, значение новой версии записывается в отдельную коллекцию. Клиенты при чтении из коллекции должны указывать какую версию они используют. Минусы: отдельное поле, без использования которого в запросе можно получить документы из других версий; дополнительное поле в индексе.
Евгений
Я так понимаю что у вас задача синхронизации внешнего источника с коллекцией в монге, при сохранении целостности представления для клиентов. Фундаментально есть два варианта: merge и replace Merge самый вычислительно сложный и требует много чтения, но не требует много записи и бесплатен с точки зрения потребления результата. Так или иначе это две тяжелые операции: вычисление дельты, обновление состояния и какой-то механизм разрешения конфликтов. Есть разные подходы к реализации, в том числе ваш, через уникальное поле и нарушение констрейна по уникальности. Replace самый дешёвый по вычислениям, но будет требовать или много записи или чуть меньеше записи, но немного стоить при потреблении результата синхронизации. Его можно реализовать или через очистку коллекции, или через вставку в новую коллекцию или через вставку в существующую коллекцию. Я не вижу смысла сразу удалять документы, по этому остаётся два варианта: 1) вставлять все данные из источника в новую коллекцию. Выделить коллекцию с фиксированным именем для хранения названия коллекции с данными последней выгрузки и использовать имя этой коллекции на стороне клиента для выборки. Минус такого подхода что имя коллекции будет не фиксированое, придётся постоянно следить за индексам. Плюс: он ничего кроме обновления имени коллекции не требует. 2) вставлять данные из источника в существующую коллекцию, с предыдущим результатам выгрузок. Для того чтоб избежать конфликтах при вставке, в документ добавляется новое поле с «версией выгрузки». Это поле добавляется как префикс ко всем индексам в коллекции. По завершению выгрузки, значение новой версии записывается в отдельную коллекцию. Клиенты при чтении из коллекции должны указывать какую версию они используют. Минусы: отдельное поле, без использования которого в запросе можно получить документы из других версий; дополнительное поле в индексе.
я понял я бы предложил в таком духе другой вариант записывать можно в ту же коллекцию, не глядя на уникальность сделать версионирование по времени записи читать можно не запоминая ничего, просто версию с максимальным временем и отдельным процессом запустить очистку от старых версий или вообще, сначала писать, тут же в этом же скрипте удалять старую версию, а клиенты всегда самую новую читать будут и все база исчисляется терабайтами, увеличение размера за счет версий разных - как бы вообще плохой вариант - дорого по носителям очень посчитать бы, насколько размер вырастет коллекции с уборкой старых версий как-то ) но в принципе, мне не настолько критична полнота базы в момент между удалением и записью, а логика самая простая при этом и места не надо дополнительно
yopp
Выбор максимальной версии дорогая операция
yopp
Из существующей коллекции в смысле
yopp
Размер коллекции в худшем случае вырастет в два раза
yopp
Тут вопрос какой capacity у вас больше: read на вычисление дельт или write на версионирование
Евгений
Выбор максимальной версии дорогая операция
из двух дорого выбирать? да и выбирать придется только для очень ограниченного количества записей в каждый отдельный момент времени, особенно по сравнению с общим количеством записей
Евгений
GSA
Приветствую всех! Опыта в монге у меня почти нет. И появился вопрос, ответа на который не могу найти. Есть коллекция. В ней несколько полей, одно из которых дата. Из коллекции получаю запись. Обрабатываю. Меняю дату на текущую+некоторый случайный временной интервал. Записываю обратно в коллекцию. Вопрос следующий. Как сделать так, чтобы записи хранились в базе отсортированными по дате? Т.е. записываю я запись с изменённой датой в коллекцию и она (запись) сразу размещается в соответствии с сортировкой.
GSA
Или по другому: мне нужно чтобы записи сортировались не по запросу, а чтобы хранились сортированными по дате. В компасе данные выведены с какой то сортировкой. Так вот как сделать чтобы они там были сортированы по дате?
Ilya
Ну и запрашивай с сортировкой по вашему полю в чем проблема то
Евгений
Или по другому: мне нужно чтобы записи сортировались не по запросу, а чтобы хранились сортированными по дате. В компасе данные выведены с какой то сортировкой. Так вот как сделать чтобы они там были сортированы по дате?
Индексы как раз для этого же? Если вы хотите прямо на диске хранить в нужном порядке, представьте, сколько потребуется действий по перезаписи для вставки куда-нибудь в середину при нескольких миллиардах документах.
GSA
Индексы как раз для этого же? Если вы хотите прямо на диске хранить в нужном порядке, представьте, сколько потребуется действий по перезаписи для вставки куда-нибудь в середину при нескольких миллиардах документах.
Ну перезаписывать данные было бы не обязательно. Существует же какая то сортировка по умолчанию? Может по _id? И быть может её можно изменить? Не переписывая данные. И тогда, без указания сортировки в запросе, данные считывались бы сортированными по "изменённому" умолчанию. И при добавлении новой записи включать её в индекс.
Dmitriy
а какой смысл от этой задачи, какую практическую цель вы пытаетесь достичь? избавится в коде от сортировки, но зачем?
Dmitriy
Есть индекс по умолчанию по _id
немного добавлю: и это сделано не просто так, а из соображений того что монга гарантирует наличие этого поля. какие еще будут поля в документах (а в одной коллекции могут быть документы с разными наборами полей) монга не знает. и соответственно строить по ней сортировку не может
GSA
а какой смысл от этой задачи, какую практическую цель вы пытаетесь достичь? избавится в коде от сортировки, но зачем?
Дело в том, что код я могу вообще не писать. Софт позволяет "кубиками"оперировать. И есть вариант кубика типа "получить все записи коллекции". Там нет возможности сортировку указать. Вот и считывается коллекция в том порядке в котором записывалась. А хотелось бы этот порядок изменить, чтобы не сортировать клиентом.
Евгений