P
у меня есть несколько реплик и видимо надо аггрегацию делать как-то иначе
Hellomik
Хай как избежать такой проблемы с повтореними Objec id внутри ratings?
Hellomik
вот сам код nodeJs await this.institutionsCollection.findOneAndUpdate( { _id: new ObjectId(institutionId), 'ratings._id': new ObjectId(userId), }, { $addToSet: { ratings: { _id: new ObjectId(userId), rank: rank }, }, }, { upsert: true }, );
Anonymous
вот сам код nodeJs await this.institutionsCollection.findOneAndUpdate( { _id: new ObjectId(institutionId), 'ratings._id': new ObjectId(userId), }, { $addToSet: { ratings: { _id: new ObjectId(userId), rank: rank }, }, }, { upsert: true }, );
Это либа какая-то оборачивает в промисы методы коллекции? А то в обычном пакете mongodb такой функциональности, вроде бы, нет... 🤔
Hellomik
Должно быть, это же пока простая штука
Anonymous
Это обычная либо mongo
Обычный findOneAndUpdate возвращает undefined, а тут промис 🤷‍♀
Anonymous
Хммм... возможно, он возвращает промис, если не передать колбэк?
Hellomik
Хммм... возможно, он возвращает промис, если не передать колбэк?
Блин чувак он возвращает точный ответ, тут не в этом проблема
Hellomik
Тут проблема в оперторах
Anonymous
Я не про тут, я про вообще 😅
Anonymous
Говорю, поинтересовался возможностью применения await к методам коллекций в пакете mongodb для nodejs
Aleksandr
не передал колбек там промис да
Anonymous
Потому что до этого юзал только колбэки
Anonymous
не передал колбек там промис да
Каеф. А я писал обёртки, возвращающие промис, внутри которых был колбэк... 🤦‍♀
Aleksandr
щас бы колбеки юзать в 2К19
Hellomik
Ок забыли
Anonymous
щас бы колбеки юзать в 2К19
Поэтому обёртки и писал 🤷‍♀ я просто чекнул (с колбэком офк 😅), метод вернул undefined. Вот я и пустился во все тяжкие
Artem
А как можжно в mongodb сравнить поля и сделать выборку db.users.find({'tariff.object.options.max_messages': {$gt: '$tariff.statisc.messages'}})
yopp
Точнее через $expr
yopp
Но это очень медленно
Artem
Ясно спасибо
Ilya
появился вопрос по upsert=True при обновлении
Ilya
если вместо _id было решено использовать uuid
Ilya
как разрулить ситуацию что при обновлении с параметром upsert=True по запросу не найдется документ и ему сгенерится objectId в _id
Aleksandr
$setOnInsert: { _id: uuid() }
Aleksandr
Aleksandr
если есть время его отменить очень много потом сэкономите времени
Ilya
кстати, решение ошибочное
ну я могу и рядом uuid хранить в другом поле
Aleksandr
да, например id
Aleksandr
я всегда так делаю
Ilya
ок, за setOnInsert еще раз спасибо
D
Дамы и господа, есть такая задача: требуется не облачное хранилище для нескольких миллионов активно добавляемых файлов с TTL (файлы должны удаляться спустя определенное время физически и освобождать место), размером в среднем по мегабайту каждый, с резервной копией (репликой) на сервере в другом цод. Подходит ли монга в качестве движка такого хранилища? В частности интересует, сколько ей потребуется оперативки для работы с рейдом размером несколько терабайт, не упрется ли она в иопсы при примерно десяти тысячах рпм, включая около 5% из них на инсерт новых файлов, будет ли прилежно работать со всем этим добром на двух машинах, или же нужно делать кучу шардов. Кто сталкивался? Стоит ли выбирать монгу, или есть решения получше?
Nick
Дамы и господа, есть такая задача: требуется не облачное хранилище для нескольких миллионов активно добавляемых файлов с TTL (файлы должны удаляться спустя определенное время физически и освобождать место), размером в среднем по мегабайту каждый, с резервной копией (репликой) на сервере в другом цод. Подходит ли монга в качестве движка такого хранилища? В частности интересует, сколько ей потребуется оперативки для работы с рейдом размером несколько терабайт, не упрется ли она в иопсы при примерно десяти тысячах рпм, включая около 5% из них на инсерт новых файлов, будет ли прилежно работать со всем этим добром на двух машинах, или же нужно делать кучу шардов. Кто сталкивался? Стоит ли выбирать монгу, или есть решения получше?
нужно немного доп инфы: 1. ттл длявсех доков будет для каждого свой или общий? 2. сами доки это текстовые или бинарные данные? 3. какого рода запросы предполгается делать по ним, будет ли это простой доступ по ключу или планируются сложные запросы? 4. какая часть из этих данных будет "горячей" и должна будет храниться в оперативе? 5. устареващие данные будут ли повторно запрашиваться и как часто?
D
десяток минут переживет
D
понятненько...
Hellomik
кто может помочь с системой лайков ?
Josh
понятненько...
да подожди, пятница же, отпишутся
Maks
Hi all, For mongo 3.2version two node replica set on windows, I am trying to start with - - auth but it is giving error. Could you please let me know the procedure to add - - auth while start without error.
El
Приветствую. Отправить в Монгу 300 000 доков через insertMany() это Ok? Монга сама поделит на нужные доли и вставит все Ok?
El
По 100 000 по дефолту? Спасибо.
Nick
По 100 000 по дефолту? Спасибо.
The number of operations in each group cannot exceed the value of the maxWriteBatchSize of the database. As of MongoDB 3.6, this value is 100,000. This value is shown in the isMaster.maxWriteBatchSize field. https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/#execution-of-operations
nzjdMFpV
Подскажите пожалуйста, мне в агрегации нужно сделать матч на то, что бы значение одного ключа было равно сумме значения двух других ключей. Пишу currentRound: {$multiply: ["$1TeamScore", "$2TeamScore"]} А монго компасс орет Expected "[" or AggregationStage but "{" found. В чем проблема?
nzjdMFpV
{ Id: 0, name: "0", currentRound: {$multiply: ["$1TeamScore", "$2TeamScore"]}, currentRound: { $gt: 0, $lt: 13 } }
nzjdMFpV
Трабл конкретно в третьем условии, если его убрать, то все ок
Ilya
Доброго времени суток. Реализую ролевой контроль доступа. В базе данных хранятся роли следующим образом: {role: String, permissions: [String], parent: String или ObjectID} Суть в том. что роли наследуются, ну как обычно в rbac бывает. И вот у меня есть роль, есть permission. Необходимо проверить, существует ли для данной роли permission. То есть по факту нужно обратиться к роли, поискать в ее массиве permissions указанный permission, если не нашел -> переходим к parent роли, ну то есть от которой наследуется эта роль, ищем там, если не находим, переходим дальше по parent, и так пока либо не найдем нужный permission, либо не дойдем до корневой роли и ничего не найдем. Я вот думаю, как вообще лучше сделать такой запрос. Сразу на ум приходит, что придется использовать aggregation, Загвоздка состоит в том, что такой запрос придется делать каждый раз при аутентификации, поэтому очень хочеться, чтобы все было супербыстро. суперпроизводительно и систему не грузило, чтобы не пришлось перебирать кучу документов в запросе.
nzjdMFpV
Да че за бред, подсчитал сумму в проджекте, пишу в match sumRound: "$round", и он ничего не отдает взамен В чем теперь броблема?
nzjdMFpV
Не актуально, через 10 костылей решил проблему, потом когда будет время -- разберусь
Nick
Не актуально, через 10 костылей решил проблему, потом когда будет время -- разберусь
В общем случае монга пока не дает инструментов для выборки данных с помощью.сравнения данных внутри дока
Nick
понятненько...
Забыл, в общем случае если доки гарантированно меньше 16мб в виде базе64, то можете попробовать монгу, однако вам точно потребуются шарды и их можно будет реплицировать в другую монгу в другом цод. Вам нужно будет накидать тестовый стенд и погонять потестить ваш кейс. Но именно вашу задачу вполне можно решить обычными файлами и удалегием их по кронтабу, единственно подыскать решение для репликации или просто сохранять на две тачки из кода во время загрузки
Егор
Привет. Подскажите, как обходят проблемы транзакций в монге? Сейчас, так как мой сервис не очень нагруженный, я делаю следующий финт. Ставлю статус в отдельную коллекцию с информацией о том, что идёт обработка операции. У каждого статуса есть уникальный id. Моё решение можно прочитать здесь https://ru.stackoverflow.com/questions/1052847/%d0%a2%d1%80%d0%b0%d0%bd%d0%b7%d0%b0%d0%ba%d1%86%d0%b8%d0%b8-mongodb . Также там задан вопрос аналогичного содержания.
Ilya
Привет. Подскажите, как обходят проблемы транзакций в монге? Сейчас, так как мой сервис не очень нагруженный, я делаю следующий финт. Ставлю статус в отдельную коллекцию с информацией о том, что идёт обработка операции. У каждого статуса есть уникальный id. Моё решение можно прочитать здесь https://ru.stackoverflow.com/questions/1052847/%d0%a2%d1%80%d0%b0%d0%bd%d0%b7%d0%b0%d0%ba%d1%86%d0%b8%d0%b8-mongodb . Также там задан вопрос аналогичного содержания.
Какие именно проблемы транзакций в монге вы имеете ввиду? В монге реализован полноценный ACID. Единственная проблема, разве что транзакция немного потяжелее, чем обычные запросы к базе. На худой конец есть старый-добрый двухфазный коммит, если нужна консистентность, или вот с версии 4.2 завезли agg pipeline в update-запросы.
Ilya
отсутствие блокировок и очередей транзакций, должно быть
В монге есть блокировки. Советую вот с этим ознакомится. https://docs.mongodb.com/manual/faq/concurrency А вообще, лучше всего самому поэкспериментировать и прощупать. Что касается очереди, то можно самому сделать транзакцию с ретраем. Нет ничего проще, тем более, что в документации приводятся готовые шаблоны, можно брать и использовать
D
в том и дело что я щупал, так щупал что ночами не спал, программируя логику нормальной рсубд с помощью костылей типа двухфазных коммитов и коллекций состояний
D
правда это было относительно давно, может что-то изменилось
Artem
Как в компасе посчитать сумму всех полей по какому-то условию?
Artem
Нашел способ через aggregations, делая group Но условие не хочет переваривать
Artem
именно так
А как добавить сюда еще условие по определенному полю? http://dl3.joxi.net/drive/2019/12/01/0026/0774/1741574/74/8fe5f2bfbe.jpg
Artem
Чтобы он считал сумму только у объектов со status: 1
Nick
перед группировкой добавить match с фильтром по статусу
Nick
также если указать в группировке _id: "$status" то получите сумму в разрезе всех статусов
Anonymous
ребят подскажите плиз есть ли для монго типо phpmyadmin? надо на linux