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
Hellomik
Должно быть, это же пока простая штука
От
От
Hellomik
Anonymous
Хммм... возможно, он возвращает промис, если не передать колбэк?
Hellomik
Hellomik
Тут проблема в оперторах
Anonymous
Я не про тут, я про вообще 😅
Hellomik
Anonymous
Говорю, поинтересовался возможностью применения await к методам коллекций в пакете mongodb для nodejs
Aleksandr
не передал колбек там промис да
Anonymous
Потому что до этого юзал только колбэки
Aleksandr
щас бы колбеки юзать в 2К19
Hellomik
Ок забыли
Anonymous
щас бы колбеки юзать в 2К19
Поэтому обёртки и писал 🤷♀ я просто чекнул (с колбэком офк 😅), метод вернул undefined. Вот я и пустился во все тяжкие
Artem
А как можжно в mongodb сравнить поля и сделать выборку db.users.find({'tariff.object.options.max_messages': {$gt: '$tariff.statisc.messages'}})
yopp
yopp
Точнее через $expr
yopp
Но это очень медленно
Artem
Ясно спасибо
Ilya
появился вопрос по upsert=True при обновлении
Ilya
если вместо _id было решено использовать uuid
Ilya
как разрулить ситуацию что при обновлении с параметром upsert=True по запросу не найдется документ и ему сгенерится objectId в _id
Aleksandr
$setOnInsert: { _id: uuid() }
Aleksandr
Ilya
Aleksandr
если есть время его отменить очень много потом сэкономите времени
Aleksandr
да, например id
Aleksandr
я всегда так делаю
Ilya
ок, за setOnInsert еще раз спасибо
D
Дамы и господа, есть такая задача: требуется не облачное хранилище для нескольких миллионов активно добавляемых файлов с TTL (файлы должны удаляться спустя определенное время физически и освобождать место), размером в среднем по мегабайту каждый, с резервной копией (репликой) на сервере в другом цод. Подходит ли монга в качестве движка такого хранилища?
В частности интересует, сколько ей потребуется оперативки для работы с рейдом размером несколько терабайт, не упрется ли она в иопсы при примерно десяти тысячах рпм, включая около 5% из них на инсерт новых файлов, будет ли прилежно работать со всем этим добром на двух машинах, или же нужно делать кучу шардов.
Кто сталкивался? Стоит ли выбирать монгу, или есть решения получше?
Nick
Дамы и господа, есть такая задача: требуется не облачное хранилище для нескольких миллионов активно добавляемых файлов с TTL (файлы должны удаляться спустя определенное время физически и освобождать место), размером в среднем по мегабайту каждый, с резервной копией (репликой) на сервере в другом цод. Подходит ли монга в качестве движка такого хранилища?
В частности интересует, сколько ей потребуется оперативки для работы с рейдом размером несколько терабайт, не упрется ли она в иопсы при примерно десяти тысячах рпм, включая около 5% из них на инсерт новых файлов, будет ли прилежно работать со всем этим добром на двух машинах, или же нужно делать кучу шардов.
Кто сталкивался? Стоит ли выбирать монгу, или есть решения получше?
нужно немного доп инфы:
1. ттл длявсех доков будет для каждого свой или общий?
2. сами доки это текстовые или бинарные данные?
3. какого рода запросы предполгается делать по ним, будет ли это простой доступ по ключу или планируются сложные запросы?
4. какая часть из этих данных будет "горячей" и должна будет храниться в оперативе?
5. устареващие данные будут ли повторно запрашиваться и как часто?
D
Nick
D
десяток минут переживет
D
D
понятненько...
Hellomik
кто может помочь с системой лайков ?
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?
Nick
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.
В чем проблема?
Vova
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", и он ничего не отдает взамен
В чем теперь броблема?
Dmitriy
nzjdMFpV
Не актуально, через 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
D
D
Ilya
отсутствие блокировок и очередей транзакций, должно быть
В монге есть блокировки. Советую вот с этим ознакомится. https://docs.mongodb.com/manual/faq/concurrency
А вообще, лучше всего самому поэкспериментировать и прощупать. Что касается очереди, то можно самому сделать транзакцию с ретраем. Нет ничего проще, тем более, что в документации приводятся готовые шаблоны, можно брать и использовать
D
D
в том и дело что я щупал, так щупал что ночами не спал, программируя логику нормальной рсубд с помощью костылей типа двухфазных коммитов и коллекций состояний
D
правда это было относительно давно, может что-то изменилось
Artem
Как в компасе посчитать сумму всех полей по какому-то условию?
Artem
Нашел способ через aggregations, делая group
Но условие не хочет переваривать
Nick
Artem
именно так
А как добавить сюда еще условие по определенному полю?
http://dl3.joxi.net/drive/2019/12/01/0026/0774/1741574/74/8fe5f2bfbe.jpg
Artem
Чтобы он считал сумму только у объектов со status: 1
Nick
перед группировкой добавить match с фильтром по статусу
Artem
Nick
также если указать в группировке _id: "$status" то получите сумму в разрезе всех статусов
Anonymous
ребят подскажите плиз есть ли для монго типо phpmyadmin? надо на linux